研一时总结的一点实用函数,这两天没事,整理出来放到网上。
pip install opencv-python
cv2.imread(img_path,flag) 读取图片,返回图片对象
img_path:
flag:
特别注意: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
注:
显示图片,窗口自适应图片大小。可以指定多个窗口名称,显示多个图片。
window_name: 指定窗口的名字
img:显示的图片对象
创建一个窗口。winname作为窗口的唯一标识,如果想使用指定窗口显示目标图像,需要让cv2.imshow(winname)中的winname与窗口的winname需要保持一致。
窗口创建时可以添加的属性:
键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)
millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件
在查看图片时,通常写0。由程序员手动关闭
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则没有此问题
m, std = cv2.meanStdDev(im)
注意是标准差
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)
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
重点在于以下几个参数
cv2.rectangle(im,(0,200),(2000,2000),(0,0,255),15)