Python的版本是Python3.6,openCV使用的是cv2
例图
一、图像的读取、显示和保存
读取图像:cv2.imread(filename,flags)
该函数有两个参数,第一个参数是图片的地址,第二个参数是读取图像的方式(默认值为1,以RGB格式读取)
显示图片:cv2.imshow(winname,mat)
以窗口的形式显示图片,两个参数,第一个是窗口上显示的名称,第二个是图像在代码中的表示名称
保存图片:cv2.imwrite(filename,img,params)
N个参数,第一个是要保存的图像的名字,如 'Rachel.jpg' ,第二个是也是图像在代码中的表示名称,此外还有图像的质量等参数,暂且略过
销毁全部窗口:cv2.destroyALLWindows()
销毁特定窗口:cv2.destroyWindow(winname) 括号里填指定窗口名称
绑定按键:cv2.waitKey(delay)
示例代码:
按下 s 键保存图片到 png 格式
import cv2
img = cv2.imread('Rachel.jpg',1) # 若为0则是灰度图
cv2.imshow('Rachel', img)
k = cv2.waitKey(0) # 等待按键,返回按键的ASCII码值
if k == ord('s'): # 若按下 S
cv2.imwrite('Rachel.png', img)
cv2.destroyAllWindows() # 删除全部窗口
二、图像的缩放
缩放图片是非常常用的操作,cv2里面的函数是:cv2.resize
函数原型:cv2.resize(src, dst, dsize, fx=0, fy=0, interpolation=INTER_LINEAR )
fx,fy表示缩放比例,interpolation是缩放时填充的类型,有以下几种:
INTER_NEAREST(邻近元素插值法)
INTER_LINEAR(缺省值,双线性插值)
INTER_AREA(使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法)
INTER_CUBIC(立方插值)
示例代码:
图片变成原图的0.5倍的灰度图
import cv2
img = cv2.imread('Rachel.jpg', 0) # 注意,第二个参数是0,灰度图
new = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
cv2.imshow('Rachel', new)
k = cv2.waitKey(0)
if k == ord('s'):
cv2.imwrite('Rachel1.jpg', new)
cv2.destroyAllWindows()
结果:
三、图像翻转和旋转
图像翻转用到的函数是cv2.flip
函数原型:cv2.flip(src, dst, flipCode)
flipCode,翻转模式,flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿x
轴翻转,再沿Y轴翻转,等价于旋转180°)
示例代码:
import cv2
img = cv2.imread('Rachel.jpg', 0)
new = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
another_new0 = cv2.flip(new, 0)
another_new1 = cv2.flip(new, 1)
another_new_1 = cv2.flip(new, -1)
cv2.imshow('Rachel', new)
cv2.imshow('Rachel_flip_0', another_new0)
cv2.imshow('Rachel_flip_1', another_new1)
cv2.imshow('Rachel_flip_-1', another_new_1)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
图像旋转用到的函数是cv2.getRotationMatrix2D
函数原型:getRotationMatrix2D(center,angle,scale)
center一般是中心点的坐标,用元组表示
angle角度是逆时针旋转的角度
scale是比例,有放大或缩小图像的作用
示例代码:
import cv2
img = cv2.imread('Rachel.jpg', 0)
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
dst = cv2.warpAffine(img, M, (cols, rows)) # 仿射变换,以后再说
cv2.imshow('Rachel', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果: