Opencv学习笔记(3)
Opencv库常见函数
1、读取指定图片
语法:cv2.imread()函数可以用于读取指定图片,使用时需要先导入opencv库
1 import cv2 # 导入opencv库
2 sample = cv2.imread("img/sample.png") #读取img文件夹 sample.png图片,并命名为sample
Tips:通过“imread()”函数读取到的图像是以RGB为颜色空间的,且以BGR顺序排列。
cv2.IMREAD_COLOR:读取一副彩色图片,图片的透明度会被忽略,默认为该值,实际取值为1;
cv2.IMREAD_GRAYSCALE:以灰度模式读取一张图片,实际取值为0
cv2.IMREAD_UNCHANGED:加载一副彩色图像,透明度不会被忽略。
2、创建窗口
语法:cv2.namedWindow(winname[,flags])
其中,参数winname表示新建的窗口名称,自己随便取;
flags表示窗口的标识(一般默认为cv2.WINDOW_AUTOSIZE,表示窗口大小自动适应图片大小,并且不可手动更改; cv2.WINDOW_NORMAL表示用户可以改变这个窗口大小;cv.WINDOW_OPENGL窗口创建的时候会支持OpenGL)。
OpenCV也支持有限的界面编程,主要是针对窗口、控件和鼠标事件等,比如滑块。有了这些窗口和控件,可以更好地展现图像并调节图像的一些参数。
3、设置窗口
语法:cv2.setWindowProperty()
1 cv2.setWindowProperty('winname',cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN) # Set the windows to be full screen.
2 # 设置窗口全屏
“cv2.WND_PROP_FULLSCREEN”指的是可以全屏的属性,“cv2.WINDOW_FULLSCREEN”指设置窗口全屏。
4、显示图像
语法:cv2.imshow(window_name,image)
window-name:显示图像的窗口的名字
image : 要显示的图像,窗口大小自动调整为图片大小。
注意:该函数一般和cv2.waitKey()
、cv2.destroyAllWindows()
、cv2.destroyWindow()
一起使用。
cv2.waitKey()
函数是键盘绑定函数,等待键击任意键或指定键继续程序。
如果没有cv2.waitKey()函数,图像不会显示(也许是一闪而过,我们人眼观察不到),cv2.waitKey()函数是一个键盘绑定函数(相当于让程序在这里挂起暂停执行)
cv2.waitKey(k)
k:在时间k(单位ms)内,等待用户按键,返回按键的值,如果没有触发事件,则跳出等待。默认k=0,则无限等待按键。
cv2.destroyAllWindows()
用来销毁所有已经创建的窗口, 如果需要销毁指定窗口使用cv2.destroyWindow()
函数,他接受一个表示窗口名字的名字。
cv2.destroyWindow()
销毁指定窗口(从内存中清除)。
放大缩小图片的例子
1 import numpy as np # 导入numpy模块
2 import cv2 # 导入opencv模块
3
4 img = cv2.imshow('car.png') # 显示图片
5 cv2.namedWindow('image') # 创建窗口
6 cv2.imshow('image', img) # 显示窗口下的可调整大小的图片
7 cv2.waitKey(0) # 键盘绑定函数
8 cv2.destroyAllWindows() # 销毁所有创建的窗口
5、转化图像的色彩空间
语法:cv2.cvtColor()函数
通过“imread()”函数读取到的图像是RGB颜色空间的,并且是以BGR顺序排列的,因此,为了便于按颜色分割图像,我们需要将它转换为HSV色彩空间,这里可以通过Opencv库中的“cvtColor()”函数来实现。
1 sample = cv2.imread("img/sample.png")#读取img文件夹下sample.png图片,并命名为sample
2 hsv = cv2.cvtColor(sample,cv2.COLOR_BGR2HSV)#将图像sample转换为HSV色彩空间并命名为hsv
其中,sample指的是通过“imread()”函数读取到的以RGB为色彩空间的原图,
“cv2.COLOR_BGR2HSV”指的是色彩空间的转换方式为BGR→HSV,
hsv是一个变量,用于存储转换后的HSV色彩空间的图片。
6、创建零矩阵
语法:numpy.zeros()
Numpy是Python中的一个科学计算库。array()函数可以用来创建一个数组(二维矩阵)
而zero()函数创建一个多维零矩阵
1 #numpy中的zero()函数可以用来创建一个多维零矩阵,使用时,我们需要先导入该库。
2 import numpy as np
3 color = np.zeros((320, 240, 3),dtype=np.uint8) # 创建一个三维零矩阵,类型为uint8
其中,“320”指的是第一维度,“240”指的是行数,“3”指的是列数,uint8是8位无符号整形,表示范围为[0,255]的整数,它专门用于存储各种图像的矩阵类型,要想将当前的矩阵作为图像类型来进行各种操作,就要将数据类型定义为uint8。
7、 保存图片
语法:cv2.imwrite(filename,image[,params])
将图像保存到指定文件。filename:文件名,img:要保存的图像,params:格式特定参数编码
cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
8、输出图片的信息
shape:如果是彩色图像,则返回(行数,列数,通道数)的数组;如果是灰度图像,则返回(行数,列数)的数组
读取彩色图像的行数与列数
1 shape[0]=图像行数
2 shape[1]=图像列数
3 shape[2]=图像通道数
分别读取图片行数、列数与通道数
1 import cv2
2 import numpy as np
3 Img = cv2.imread('1.jpg',cv2.IMREAD_UNCHANGED)
4 print ('The number of lines of this image is:',Img.shape[0])
5 print ('The number of columns of this image is:',Img.shape[1])
6 print ('The number of channels of this image is:',Img.shape[2])
9、图片缩放
语法:cv2.resize(src, dsize, dst, fx, fy, interpolation)
其中,参数含义如下:
- src :原始图像
- dsize :目标图像尺寸,输出图像
- dst :目标图像,可以不传入,函数会自动创建一个。
- fx :沿水平方向的缩放比例
- fy :沿垂直方向的缩放比例
- interpolation :插值方法,
可选值包括 cv2.INTER_NEAREST ———— 最近邻插值法
cv2.INTER_LINEAR ———— 双线性插值法(默认)
cv2.INTER_AREA ———— 基于局部像素的重采样
cv2.INTER_CUBIC ———— 基于4x4像素邻域的3次插值法
cv2.INTER_LANCZOS4 ———— 基于8x8像素邻域的Lanczos插值
主要事项:(1)缩放图像的方法有两种,一种是利用dsize函数,指定缩放后的图像大小,dst = cv.resize(img, (400, 300))
第二种是利用fx和fy,指定缩放后图像长宽相对于原图的比例,dst = cv.resize(img, (0, 0), fx=0.5, fy=0.3)
(2)dsize和fx/fy不能同时为0,要么你就指定好dsize的值,让fx和fy空置直接使用默认值
要么你就让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍!
(3)插值方法,正常情况下使用默认的双线性插值就够用了。
几种常用方法的效率是:最邻近插值>双线性插值>双立方插值>Lanczos插值。
10、图像裁剪
语法:image[start_row : end_row,start_col : end_col]
参数:
start_row 、end_row---图像的开始与结束的行坐标。
start_col :、end_col---图像的开始与结束的列坐标。
裁剪图像是为了从图像中删除不需要的对象或区域;也就是删除其他,保留想要的图像区域。
opencv中的图像裁剪是利用numpy数组切片的方法来实现的。首先,我们要知道图像就是一个数组,其由高、宽、通道数三个维度组成。仅对图像进行裁剪,就是意味着对宽和高两个维度进行切片操作。
1 # 裁剪图像
2 cropped_car = car[25:190,50:300] # car为原图像的名字,而cropped_car是裁剪后的名字