Opencv-Python的常用操作
- 前言
- 安装
- 图片加载、显示和保存
- 读取cv2.imread
- cv2.imshow
- cv2.imshow(window_name,img)
- cv2.namedWindow(winname, 属性):
- cv2.waitKey(millseconds)
- cv2.destroyAllWindows(window_name)
- 图片写入
- 基础运算
- 像素的加减乘除
- 与或非或
- 均值和标准差
- 图像的缩放和翻转
- cv2.resize
- cv2.filp
- 图像加框
前言
研一时总结的一点实用函数,这两天没事,整理出来放到网上。
安装
pip install opencv-python
图片加载、显示和保存
读取cv2.imread
cv2.imread(img_path,flag) 读取图片,返回图片对象
img_path:
- 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None
flag:
- cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1
- cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0
- cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1
特别注意:cv2.imread读入的通道顺序是BGR,而plt.imread读入的顺序是RGB。因此可能会涉及到通道顺序转换
img = cv2.imread('1.jpg')
# cv2默认为bgr顺序
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 或者这样
im = im[:,:,::-1]
查看维度h, w, c = img.shape
注:
- 路径必须是全英文+“/”
- 彩色文件读取为[h,w,c],黑白文件读取为[h,w]
- 读取的数据类型为uint8
cv2.imshow
cv2.imshow(window_name,img)
显示图片,窗口自适应图片大小。可以指定多个窗口名称,显示多个图片。
window_name: 指定窗口的名字
img:显示的图片对象
cv2.namedWindow(winname, 属性):
创建一个窗口。winname作为窗口的唯一标识,如果想使用指定窗口显示目标图像,需要让cv2.imshow(winname)中的winname与窗口的winname需要保持一致。
窗口创建时可以添加的属性:
- cv2.WINDOW_NORMAL:窗口大小可以改变(同cv2.WINDOW_GUI_NORMAL)
- cv2.WINDOW_AUTOSIZE:窗口大小不能改变
- cv2.WINDOW_FREERATIO:窗口大小自适应比例
- cv2.WINDOW_KEEPRATIO:窗口大小保持比例
cv2.waitKey(millseconds)
键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)
millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件
在查看图片时,通常写0。由程序员手动关闭
cv2.destroyAllWindows(window_name)
window_name: 需要关闭的窗口名字,不传入时关闭所有窗口
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
print(key)
cv2.destroyAllWindows()
图片写入
cv2.imwrite(img_path_name,img)
img_path_name:保存的文件名
img:文件对象
基础运算
通常来说,对于像素的运算工作,一般都是使用numpy来完成的。我们只是使用opencv已封装好的函数,比如翻转,裁剪啊什么的。
像素的加减乘除
• dst = cv2.add(m1, m2)
• dst = cv2.subtract(m1, m2)
• dst = cv2.multiply(m1, m2)
• dst = cv2.divide(m1, m2)
注意:两个像素的相加不完全等于numpy中的相加
x = np.uint8([120])
y = np.uint8([240])
# opencv对超过255的值(uint8),直接截取255
print(cv2.add(x,y))
# numpy的做法是(x+y)%256
print(x+y)
而将像素值转变为np.float则没有此问题
与或非或
• dst = cv2.bitwise_and(m1, m2)
• dst = cv2.bitwise_or(m1, m2)
• dst = cv2.bitwise_not(m1, m2)
• dst = cv2.bitwise_xor(m1, m2)
均值和标准差
m, std = cv2.meanStdDev(im)
注意是标准差
图像的缩放和翻转
cv2.resize
dst = cv2.resize( src, dsize, fx, fy, interpolation )
src | 输入图片 |
dsize | 输出图片尺寸 |
fx, fy | 沿x轴,y轴的缩放系数 |
interpolation | 插入方式 |
cv2.INTER_NEAREST | 最近邻插值 |
cv2.INTER_LINEAR | 双线性插值(默认设置) |
cv2.INTER_AREA | 使用像素区域关系进行重采样 |
cv2.INTER_CUBIC | 4x4像素邻域的双三次插值 |
cv2.INTER_LANCZOS4 | 8x8像素邻域的Lanczos插值 |
h,w,c = im.shape
# 直接指定大小,尺寸必须是整数
# 注意此处的顺序是(w,h)!
im2 = cv2.resize(im,(round(0.5*w),round(0.5*h)))
# 指定缩放比例
im3 = cv2.resize(im,(0,0),fx=0.5,fy=0.5)
cv2.filp
-
img2=cv2.flip(img1, 0)
#上下翻转 -
img2=cv2.flip(img1, 1)
#左右翻转 -
img2=cv2.flip(img1, -1)
#上下、左右翻转
图像加框
其实当时的程序里用到很多cv2的函数,这里只记了一个基础的。需要什么再查吧。cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → None
重点在于以下几个参数
- img,输入图像
- pt1,方框左上角的坐标(x,y)
- pt2,方框右下角的坐标(x,y)
- color,框的颜色(B,G,R)
- thicknes,线的粗细
cv2.rectangle(im,(0,200),(2000,2000),(0,0,255),15)
参考