● Core:核心模块
●Improc:图像转化模块
●Highgui:图形交互模块
●Video:视频模块
●Calib3d:3d算法模块
●Feature2d:2d算法模块
●Ml:机器学习模块
●Flann:快速近邻算法模块
●GPU:GPU加速模块
●Photo:摄影学图片模块
●Stitching:图像拼接模块
● bioinspired:生物视觉模块。
● datasets:数据集读取模块。
● dnn:深度神经网络模块。
● face:人脸识别模块。
● matlab:MATLAB接口模块。
● stereo:双目立体匹配模块。
● text:视觉文本匹配模块。
● tracking:基于视觉的目标跟踪模块。
● ximgpro:图像处理扩展模块。
● xobjdetect:增强2D目标检测模块。
● xphoto:计算摄影扩展模块
cv2.imread()用来读取图像,该函数支持各种静态图像格式,语法格式如下:
● retval是返回值,其值是读取到的图像。如果未读取到图像,则返回“None”。
● filename表示要读取的图像的完整文件名。
● flags 是可选参数
注意:filename参数的选择
① filename 位于工作路径下时可以使用相对路径(即可省略当前工作路径部分),也可以使用绝对路径。
②filename 不位于工作路径下时只能使用绝对路径。
cv2.namedWindow()用来创建指定名称的窗口,其语法格式为:
cv2.imshow()用来显示图像,其语法格式为:
● winname是窗口名称。
● mat是要显示的图像
注意:在不使用cv2.nameWindow()函数创建名为winname的窗口时调用cv2.imshow()会自动创建一个名为winname的窗口。
cv2.waitkey()用于等待用户按键输入,其语法格式为:
● retval表示返回值。如果没有按键被按下,则返回-1;如果有按键被按下,则返回该按键的ASCII码
。
● delay表示等待键盘触发的时间,单位是ms
。当该值是负数或者零时,表示无限等待。该值默认为0
。
cv2.destoryWindow()用来销毁以创建的窗口,其语法格式为:
●winname表示以创建窗口的名称。
import cv2
lena = cv2.imread("Resources/lena.png")
cv2.imshow("image1",lena)
while(True):
key = cv2.waitKey(10)
if (key == 'e'):
cv2.destoryWindow("image1")
break
cv2.imwrite()用来保存图像,其语法如下:
● retval是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。
● filename是要保存的目标文件的完整路径名,包含文件扩展名。
● img是被保存图像的名称。
● params是保存类型参数,是可选的。
cv2.destoryAllWindow()用于销毁所有窗口。
图像二值化:这类图像仅仅包含了黑白两种像素点。
灰度图像:只有一个处理通道,计算机会将灰度处理为256个灰度级,用数值区间[0, 255]来表示。其中,数值“255”表示纯白色,数值“0”表示纯黑色,其余的数值表示从纯白到纯黑之间不同级别的灰度
例如,可以使用numpy.zeros((5,5),uint_8) 来生成一个尺寸为 5×5填充为0的灰度图像,
也可以使用numpy.random.randint(0,100,size=[5,5],dtype=np.uint8) 随机生成一个尺寸为 5×5的灰度图像
彩色图像:有三个色彩通道,RGB色彩空间中,存在R(red,红色)通道、G(green,绿色)通道和B(blue,蓝色)通道,共三个通道。每个色彩通道值的范围都在[0, 255]之间,我们用这三个色彩通道的组合表示颜色
通常用一个三维数组来表示一幅RGB色彩空间的彩色图像,在OpenCV中,
通道的顺序是B→G→R
,图像就是Numpy库中的数组。
例如,可以使用image[0,0]访问图像image第0行第0列位置上的像素点。第0行第0列位于图像的左上角,其中第1个索引表示第0行,第2个索引表示第0列。
例1:可以使用image[0,0,0]访问图像image的B通道内的第0行第0列上的像素点,
式中:
● 第1个索引表示第0行。
● 第2个索引表示第0列。
● 第3个索引表示第0个颜色通道(0,1,2三个通道分别表示BGR)
例2:有一个红色(其R通道值为1, G通道值为2, B通道值为3)图像,不同的访问方式得到的值如下。
● img[0,0]:访问图像img第0行第0列像素点的BGR值。图像是BGR格式的,得到的数值为[1,2,3]。
● img[0,0,0]:访问图像img第0行第0列第0个通道的像素值。图像是BGR格式的,所以第0个通道是B通道,会得到B通道内第0行第0列的位置所对应的值0。
● img[0,0,1]:访问图像img第0行第0列第1个通道的像素值。图像是BGR格式的,所以第1个通道是G通道,会得到G通道内第0行第0列的位置所对应的值0。
● img[0,0,2]:访问图像img第0行第0列第2个通道的像素值。图像是BGR格式的,所以第2个通道是R通道,会得到R通道内第0行第0列的位置所对应的值255。
numpy.zeros() 创建一个图像数组,其格式如下:
numpy.zeros((行,列[,通道]),dtype=numpy.uint8)
# 例如
Img = np.zeros((256,256),dtype=np.uint8)
Img = np.zeros((256,256,3),dtype=np.uint8)
numpy.item()提供行列参数,更直接访问图像的值。其格式如下:
numpy.itemset()提供索引值,更直接修改图像的值。其格式如下:
numpy.array提供了item()和itemset()函数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够更大幅度地提高处理效率。在访问及修改像素点的值时,利用numpy.array提供的函数比直接使用索引要快得多,同时,这两个函数的可读性也更好。
import cv2
import numpy as np
Img = np.zeros((256,256),dtype=np.uint8)
for i in range(10,100):
for j in range(20,200):
Img.itemset((i,j),255)
Img.itemset((5,5),255)
print(Img)
cv2.imshow("Img",Img)
cv2.waitKey(0)
randImg = np.random.randint(Low,Hign,size=[行,列,通道],dtype=np.uint8)
# 例如
randImg = np.random.randint(0,100,size=[10,10],dtype=np.uint8)
randImg = np.random.randint(0,100,size=[10,10,3],dtype=np.uint8)
import cv2
import numpy as np
newImg = np.zeros((256,256))
print(newImg[0,0])
newImg[0:100,0:100] = 255
print(newImg[0,0])
cv2.imshow("img1",newImg)
cv2.waitKey(0)
import cv2
import numpy as np
# 创建三个包含三个通道并填充初始化为0
Blue = np.zeros((256,256,3))
Green = np.zeros((256,256,3))
Red = np.zeros((256,256,3))
# 在不同的图像不同通道填充255
Blue[:,:,0] = 255 #B通道填充255
Green[:,:,1] = 255 #G通道填充255
Red[:,:,2] = 255 #R通道填充255
cv2.imshow("Blue",Blue)
cv2.imshow("Green",Green)
cv2.imshow("Red",Red)
cv2.waitKey(0)
图像像素点的第二种访问修改操作item()与itemset()和两种产生灰度图像的方式。
import cv2
import numpy as np
Img = np.zeros((256,256),dtype=np.uint8)
randImg = np.random.randint(0,100,size=[256,256],dtype=np.uint8)
Img.itemset((5,5),255)
print("img.item(5,5) = " ,Img.item(5,5))
print(Img)
print(randImg)
cv2.imshow("Img",Img)
cv2.imshow("randImg",randImg)
cv2.waitKey(0)
注意:图像操作必须保证操作部分的图像分辨率相同。
从图像提取一部分出来,对另一个图像进行简单操作
import cv2
import numpy as np
Img = np.zeros((400,400),dtype=np.uint8) # 新建一个图像
for column in range(0,100):
for row in range(0,100):
Img.itemset((column,row),255)
Roi = Img[0:100,0:100];
Img[0:100,200:300] = Roi;
cv2.imshow("Roi",Roi)
cv2.imshow("Img",Img)
cv2.waitKey(0)
import cv2
import numpy as np
Img = cv2.imread("Resources\lena.png")
imgBlue = Img[:,:,0]
imgGrren = Img[:,:,1]
imgRed = Img[:,:,2]
cv2.imshow("Img",Img)
cv2.imshow("imgBlue",imgBlue)
cv2.imshow("imgGrren",imgGrren)
cv2.imshow("imgRed",imgRed)
cv2.waitKey(0)
cv2.split()能够拆分图像的通道,其语法如下:
import cv2
import numpy as np
Img = cv2.imread("Resources\lena.png")
b,g,r = cv2.split(Img)
cv2.imshow("Img",Img)
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
cv2.waitKey(0)
注意:cv2.split() 返回一个包含三个矩阵的数组。
cv.merge()函数可以将不同通道的图像合成,其语法如下
import cv2
import numpy as np
Img = cv2.imread("Resources\lena.png")
b,g,r = cv2.split(Img)
mergeImgbge = cv2.merge([b,g,r])
mergeImgrgb = cv2.merge([r,g,b])
mergeImggrb = cv2.merge([g,r,b])
cv2.imshow("Img",Img)
cv2.imshow("mergeImgbge",mergeImgbge)
cv2.imshow("mergeImgrgb",mergeImgrgb)
cv2.imshow("mergeImggrb",mergeImggrb)
cv2.waitKey(0)
● shape:
如果是彩色图像,则返回包含行数、列数、通道数的数组;
如果是二值图像或者灰度图像,则仅返回行数和列数。
通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。
● size:返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
● dtype:返回图像的数据类型。
图像为一个类,类里面包含了处理实例化对象的方法和变量。所以我们可以通访问对象的变量来访问其属性。
import cv2
import numpy as np
Img = cv2.imread("Resources\lena.png")
print("size = ",Img.size)
print("shape = ",Img.shape)
print("dtype = ",Img.dtype)
cv2.waitKey(0)