一、学习目标
了解图片如何进行镜像 了解图片如何进行腐蚀 了解图片如何进行膨胀 了解图片如何进行开运算 了解图片如何进行闭运算上一节:[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转
二、了解图片的一般操作(镜像、腐蚀、膨胀、开运算、闭运算)2.1 了解如何对图片进行镜像操作
在opencv中,我们可以对图片进行镜像操作,镜像是指两个图片某一点开始进行对称。图片的镜像操作其实也是对图像数据进行的操作。
首先读取图片,并且创建一个可拖动的窗口,为了防止镜像后图片过大不利于观察: import cv2 import numpy as np img = cv2.imread(rC:\Users\mx\Desktop\1.jpg) cv2.namedWindow(“Image”,cv2.WINDOW_NORMAL)随后获取图片的宽高以及通道,这是因为我们需要对一些数据进行操作,操作的话一定是需要宽高的。我们即将通过宽高创建一张图片,如果我们需要上下镜像,那么就是高度是原来图片的2倍长度。代码如下:
cv2.imshow(src, img) imgshape = img.shape height= imgshape[0] width = imgshape[1] c = imgshape[2]随后创建一张高度2的图片,我们需要在这张图片中显示图片镜像的内容,如果镜像是上下进行镜像那么则是高度需要2:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算](https://cms-pic.yhzz.com.cn/1683803579548.jpg)
代码如下:
dst = np.zeros([height*2, width, c], np.uint8)之后就简单了,通过循环嵌套遍历图片的内容,并且从图片的第一列第一行开始给予数据,由于我们的图片是镜像的,所以第一列第一行所需要对称于最后一列最后一行:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算1 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算1](https://cms-pic.yhzz.com.cn/1683803579713.jpg)
以上代码中dst[i,j] = img[i,j]为正常从第一行第一列开始往下对图片进行赋值,dst[height*2-i-1,j] = img[i,j]则表示从最下面一行开始网上赋值,所以height*2-i-1则依次表示从下网上的位置信息。完整代码如下:
import cv2 import numpy as np img = cv2.imread(rC:\Users\mx\Desktop\1.jpg) cv2.namedWindow(“Image”,cv2.WINDOW_NORMAL) imgshape = img.shape height= imgshape[0] width = imgshape[1] c = imgshape[2] dst = np.zeros([height*2, width, c], np.uint8) for i in range( height ): for j in range( width ): dst[i,j] = img[i,j] dst[height*2-i-1,j] = img[i,j] cv2.imshow(Image, dst) cv2.imshow(src, img) cv2.waitKey(0)结果如下:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算2 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算2](https://cms-pic.yhzz.com.cn/1683803579854.jpg)
左右镜像和上下镜像相同,只需要将宽度改为2倍宽,循环的时候从最右边进行赋值依次赋值即可,然后长度宽度的循环位置调换一下即可,代码如下:
dst = np.zeros([height, width*2, c], np.uint8) for i in range( width ): for j in range( height ): dst[j,i] = img[j,i] dst[j,width*2-i-1] = img[j,i]结果如下:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算3 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算3](https://cms-pic.yhzz.com.cn/1683803580067.jpg)
2.2 了解如何对图片进行腐蚀操作
腐蚀是OpenCV中的形态学操作,腐蚀需要使用erode函数。腐蚀可以使眼色对比突出,但在某些图片上使用腐蚀会适得其反。例如如下案例:
import cv2 import numpy as np img = cv2.imread(rC:\Users\mx\Desktop\1.jpg) cv2.namedWindow(“Image”,cv2.WINDOW_NORMAL) cv2.namedWindow(“img_erode”,cv2.WINDOW_NORMAL) cv2.imshow(Image, img) img_erode = cv2.erode(img,None,iterations=1) cv2.imshow(img_erode,img_erode) cv2.waitKey()以上代码中,腐蚀使用了erode函数,erode函数的iterations参数越大,腐蚀效果越明显,以下是为1时的腐蚀效果,我们发现在图案边缘处会有明显的黑边。
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算4 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算4](https://cms-pic.yhzz.com.cn/1683803580253.jpg)
效果如下:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算5 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算5](https://cms-pic.yhzz.com.cn/1683803580371.jpg)
我们换一张图片:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算6 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算6](https://cms-pic.yhzz.com.cn/1683803580449.jpg)
2.3 了解如何对图片进行膨胀操作
膨胀操作的简单使用也是非常简单,使用dilate方法,用法与erode类似。膨胀操作也是用如其名,就是变胖。代码如下:
import cv2 import numpy as np img = cv2.imread(rC:\Users\mx\Desktop\sss11.png) cv2.namedWindow(“Image”,cv2.WINDOW_NORMAL) cv2.namedWindow(“img_dilate”,cv2.WINDOW_NORMAL) cv2.imshow(Image, img) img_dilate = cv2.dilate(img,None,iterations=2) cv2.imshow(img_dilate,img_dilate) cv2.waitKey()效果如下:
2.4 了解如何对图片进行开运算与闭运算操作
先腐蚀后膨胀叫做开运算,可以用于降噪。开运算使用morphologyEx函数,需要传入一个卷积核。完整代码如下:
import cv2 import numpy as np img = cv2.imread(rC:\Users\mx\Desktop\5566.png) cv2.namedWindow(“Image”,cv2.WINDOW_NORMAL) cv2.namedWindow(“img_dilate”,cv2.WINDOW_NORMAL) kn=np.ones((5,5),np.uint8)#卷积核 cv2.imshow(Image, img) img_dilate = cv2.morphologyEx(img,cv2.MORPH_OPEN,kn) cv2.imshow(img_dilate,img_dilate) cv2.waitKey()以上morphologyEx方法传入了img需要操作的图片,MORPH_OPEN表示需要进行的操作,此处为开运算,kn为卷积核。其它代码不再赘述。
结果如下:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算8 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算8](https://cms-pic.yhzz.com.cn/1683803580566.jpg)
结果如下:
![[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算9 [python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算9](https://cms-pic.yhzz.com.cn/1683803580609.jpg)
通过对比我们明显看到,前景内容中的黑点没了。