[CV系列]OpenCV基础01-初探OpenCV

92 阅读3分钟

OpenCV基础01

OpenCV是相当常用的计算机视觉库,提供了丰富的接口,方便我们进行图像处理与分析,本节介绍OpenCV最为基础的部分

OpenCV的Python版本安装非常简单,本节不多说,本节使用的也是python版本

窗口显示图片

我们可以像下面这样在窗口中显示图片:

import cv2
grass=cv2.imread('filepath')#读取图片
cv2.imshow('Field',grass)#显示图片
cv2.waitKey()#等待按键
cv2.destroyAllWindows()#销毁所有窗口

其中,我们重点说一下imread:

reval=cv2.imread(path,params)
这里的返回值为图片变量
path是图片的路径
params可以为-101
-1表示不改变原图片格式
0表示读取原图像的灰度图像
1表示读取原图像的BGR的三通道图像

我们还可以用cv2.imwrite来保存图片,语法如下:

r=cv2.imwrite(路径,图片格式变量)
如果保存(写入)成功返回True反之则是False

简单图像处理

opencv支持用image[1,1]访问单个的像素点,如果该图片是三通道的彩色图,那么会返回一个三维列表,分别代表BGR通道

如果是灰度图像或者是二值图像,则返回灰度值

我们可以通过索引更改相应像素点的属性,比如下面这样:

import cv2
grass=cv2.imread('./assets/cy.jpeg')
for i in range(1,100):
    for j in range(1,100):
        grass[i,j]=0
cv2.imshow('dd',grass)
cv2.waitKey()

除了用for循环,还可以像下面这样使用索引修改:

grass=cv2.imread('./assets/cy.jpeg')
grass[1:100,1:100]=0
cv2.imshow('dd',grass)
cv2.waitKey()

对于彩色图像,我们可以通过下面的方式,拆分出BGR通道:

b=img[:,:,0]
b=img[:,:,1]
b=img[:,:,2]

我们也可以像下面这样拆分:

b,g,r=cv2.split(img)

我们可以合并BGR通道,合成得到一张图片

grass=cv2.imread('./assets/cy.jpeg')
b,g,r=cv2.split(grass)
bgr=cv2.merge([b,g,r])
cv2.imshow('dd',bgr)
cv2.waitKey()
cv2.destroyAllWindows()

我们还可以通过函数调整图像大小:

我们可以像下面这样获取相应的宽和高,使用resize函数:

grass=cv2.imread('./assets/cy.jpeg')
rows,cols=grass.shape[:2]
size=(int(cols*0.5),int(rows*0.5))#前宽后高
rst=cv2.resize(grass,size)
cv2.imshow('dd',rst)
cv2.waitKey()
cv2.destroyAllWindows()

或者写成下面这样:

rst=cv2.resize(grass,None,None,0.5,0.5,cv2.INTER_AREA)

上面的两个None为固定用法,这两个参数在此时无用,至于后面两个0.5,则分别代表x轴方向(也就是width)的缩放比例以及height的缩放比例,最后一个参数叫插值方式,默认为cv2.INTER_LINEAR,但在缩小图片时建议用cv2.INTER_AREA

我们还可以截取我们感兴趣的区域(方式就是之前的区域索引)

其他操作

掩模

掩模,又叫掩码,用于控制图像处理的区域,是一个数组

掩模可以完成以下操作:

1.ROI提取:提取图片中掩模指定的区域,其他区域被置为黑色或者白色

2.屏蔽作用:仅让掩模指定区域参与运算

3.结构特征提取:用图像匹配方法检测和提取图像中与掩模相似的结构特征

我们了解一下掩码通过运算发挥作用的过程:

乘法运算:

这里的乘法运算就是对应元素相乘并不是矩阵乘法,代码如下:

grass=cv2.imread('./assets/cy.jpeg',1)
h,w,c=grass.shape
m=np.zeros((h,w,c),dtype=np.uint8)#这就是掩码
m[100:400,200:400]=1
res=m*grass
cv2.imshow('dd',res)
cv2.waitKey()
cv2.destroyAllWindows()

上面的过程除了可以用乘法运算完成,还可以用按位与运算:

res=cv2.bitwise_and(m,grass)

效果是一样的

掩码作为函数参数

cv2.add函数可以传入掩码,有掩码时,像素相加操作只会发生在掩码非空区域,其余区域由于掩码作用被置为黑色:

grass=cv2.imread('./assets/cy.jpeg',1)
xk=cv2.imread('./assets/bk1.png',1)
g=cv2.resize(grass,(590,386))
h,w,c=grass.shape
m=np.zeros((h,w,c),dtype=np.uint8)#这就是掩码
m[100:300,200:300]=1
res=cv2.add(g,xk,m)
cv2.imshow('dd',res)
cv2.waitKey()
cv2.destroyAllWindows()