Opencv入门系列一

Opencv入门系列一

一、库

1.1 分类

1.1.1 Opencv库

● Core:核心模块

●Improc:图像转化模块

●Highgui:图形交互模块

●Video:视频模块

●Calib3d:3d算法模块

●Feature2d:2d算法模块

●Ml:机器学习模块

●Flann:快速近邻算法模块

●GPU:GPU加速模块

●Photo:摄影学图片模块

●Stitching:图像拼接模块

1.1.2 贡献库

● bioinspired:生物视觉模块。

● datasets:数据集读取模块。

● dnn:深度神经网络模块。

● face:人脸识别模块。

● matlab:MATLAB接口模块。

● stereo:双目立体匹配模块。

● text:视觉文本匹配模块。

● tracking:基于视觉的目标跟踪模块。

● ximgpro:图像处理扩展模块。

● xobjdetect:增强2D目标检测模块。

● xphoto:计算摄影扩展模块

二、基本操作图像

1.1 cv2.imread()

cv2.imread()用来读取图像,该函数支持各种静态图像格式,语法格式如下:

image-20210128150351747

● retval是返回值,其值是读取到的图像。如果未读取到图像,则返回“None”。

● filename表示要读取的图像的完整文件名。

● flags 是可选参数

Opencv入门系列一_第1张图片

注意:filename参数的选择

① filename 位于工作路径下时可以使用相对路径(即可省略当前工作路径部分),也可以使用绝对路径。

②filename 不位于工作路径下时只能使用绝对路径。

1.2 cv2.namedWindow()

cv2.namedWindow()用来创建指定名称的窗口,其语法格式为:

image-20210128150733289

1.3 cv2.inshow()

cv2.imshow()用来显示图像,其语法格式为:

image-20210128150829703

● winname是窗口名称。

● mat是要显示的图像

注意:在不使用cv2.nameWindow()函数创建名为winname的窗口时调用cv2.imshow()会自动创建一个名为winname的窗口。

1.4 cv2.waitkey()

cv2.waitkey()用于等待用户按键输入,其语法格式为:

image-20210128151422014

● retval表示返回值。如果没有按键被按下,则返回-1;如果有按键被按下,则返回该按键的ASCII码

● delay表示等待键盘触发的时间,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0

1.5 cv2.destoryWindow()

cv2.destoryWindow()用来销毁以创建的窗口,其语法格式为:

image-20210128151648952

●winname表示以创建窗口的名称。

1.5.1 使用示例

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

1.6 cv2.imwrite()

cv2.imwrite()用来保存图像,其语法如下:

image-20210128152459152

● retval是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。

● filename是要保存的目标文件的完整路径名,包含文件扩展名。

● img是被保存图像的名称。

● params是保存类型参数,是可选的。

1.7 cv2.destoryAllWindows()

cv2.destoryAllWindow()用于销毁所有窗口。

三、图像的类型

  • 包括二值化、灰度、彩色图像等

3.1 图像二值化

图像二值化:这类图像仅仅包含了黑白两种像素点。

3.2 灰度图像

灰度图像:只有一个处理通道,计算机会将灰度处理为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的灰度图像

3.3彩色图像

彩色图像:有三个色彩通道,RGB色彩空间中,存在R(red,红色)通道、G(green,绿色)通道和B(blue,蓝色)通道,共三个通道。每个色彩通道值的范围都在[0, 255]之间,我们用这三个色彩通道的组合表示颜色

Opencv入门系列一_第2张图片

通常用一个三维数组来表示一幅RGB色彩空间的彩色图像,在OpenCV中,通道的顺序是B→G→R,图像就是Numpy库中的数组。

例如,可以使用image[0,0]访问图像image第0行第0列位置上的像素点。第0行第0列位于图像的左上角,其中第1个索引表示第0行,第2个索引表示第0列。

3.3.1 彩色图像的数组表示

例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]。

  • 1:在(0,0,)位置,通道B像素值为1
  • 2:在(0,0,)位置,通道G像素值为2
  • 3:在(0,0,)位置,通道R像素值为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。

3.4 新用函数

3.4.1 numpy.zeros()

numpy.zeros() 创建一个图像数组,其格式如下:

numpy.zeros((,[,通道]),dtype=numpy.uint8)
# 例如
Img = np.zeros((256,256),dtype=np.uint8)
Img = np.zeros((256,256,3),dtype=np.uint8)

3.4.2 img.item()

numpy.item()提供行列参数,更直接访问图像的值。其格式如下:

image-20210128160412899

image-20210128162832378

3.4.3 imag.itemset()

numpy.itemset()提供索引值,更直接修改图像的值。其格式如下:

image-20210128160424398

image-20210128162849478

numpy.array提供了item()和itemset()函数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够更大幅度地提高处理效率。在访问及修改像素点的值时,利用numpy.array提供的函数比直接使用索引要快得多,同时,这两个函数的可读性也更好。

3.4.3.1 程序示例
  • 使用for-in 整体修改某个区域的值
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)

Opencv入门系列一_第3张图片

3.4.4 numpy.random.randint()

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)
  • low 产生随机数下限
  • High产生随机数上限
  • size 图像大小
  • dtype 数据类型

程序示例 1

  • 图像是numpy.array中的一个三维数组
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)

程序示例2

  • 建立图像并简单操作每个通道
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)

Opencv入门系列一_第4张图片

程序示例3

图像像素点的第二种访问修改操作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)

注意:图像操作必须保证操作部分的图像分辨率相同。

Opencv入门系列一_第5张图片

四、图像属性

4.1 图像提取(ROI:感兴趣区域)

从图像提取一部分出来,对另一个图像进行简单操作

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)

Opencv入门系列一_第6张图片

4.2 通道拆分

4.2.1 索引法

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)


4.2.2 函数法cv2.split()

cv2.split()能够拆分图像的通道,其语法如下:

image-20210128165502166

image-20210128165509072

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() 返回一个包含三个矩阵的数组。

4.3 通道合并cv2.merge()

cv.merge()函数可以将不同通道的图像合成,其语法如下

image-20210128170453205

  • 简单将图片拆分后进行不同通道形式的合成
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)

4.4 图像的常用属性

● shape:

如果是彩色图像,则返回包含行数、列数、通道数的数组;

如果是二值图像或者灰度图像,则仅返回行数和列数。

通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。

● size:返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。

● dtype:返回图像的数据类型。

4.4.1 获取图像的属性

图像为一个类,类里面包含了处理实例化对象的方法和变量。所以我们可以通访问对象的变量来访问其属性。

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)

image-20210128171147180

你可能感兴趣的:(Opencv入门,python,opencv,计算机视觉)