本节我们将介绍如实使用OpenCV进行图像的形态学操作,包括图像的腐蚀和膨胀,以及图像的开运算闭运算。
1.图像的腐蚀操作
OpenCV中的腐蚀操作的函数为:
erosion_img = cv2.erode(img_ori, kernel, iterations=1)
其中img_ori为原图像,kernel为腐蚀的滤波核,iterations为腐蚀迭代操作的次数,erosion_img为腐蚀后的图像。
图像的腐蚀是有方向性的,腐蚀的本质就是黑吃白,即数值较小的(较黑的)吃掉数值较大的(较白的),下面我们给出两个例子来体现腐蚀的这一特性,帮助理解。
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\..\Pictures\Saved Pictures\liuge2.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#腐蚀操作,黑色侵蚀白色
kernel = np.ones((5, 5), np.uint8)
erosion1 = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion1 ', erosion1 )
cv2.waitKey(0)
cv2.destroyAllWindows()
原图像的输出结果为:
对该图像进行一次腐蚀操作的结果为:
我们可以看到白色“刘哥”上面的毛刺有效的较少了一部分,我们可以加大迭代的次数把毛刺完全消除;下面展示下两次三次迭代的代码和效果:
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\...\Pictures\Saved Pictures\liuge2.jpg')
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#腐蚀操作
kernel = np.ones((5, 5), np.uint8)
erosion1 = cv2.erode(img, kernel, iterations=1)
erosion2 = cv2.erode(img, kernel, iterations=2)
erosion3 = cv2.erode(img, kernel, iterations=3)
res = np.hstack((erosion1, erosion2, erosion3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
对应效果为:
可以发现我们通过增加迭代次数,使得黑色对白色的腐蚀加重去掉了毛刺。
下面我们在看一组腐蚀操作,只是换了一副输入的图像:
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\..\Pictures\Saved Pictures\liuge1.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#腐蚀操作,黑色侵蚀白色
kernel = np.ones((5, 5), np.uint8)
erosion1 = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion1 ', erosion1 )
cv2.waitKey(0)
cv2.destroyAllWindows()
此时我们的输入原图像为:
与之前的图像相比只是文字与背景的颜色发生的对换,此时我们我们对赐福图像腐蚀后的结果为:
腐蚀后发现毛刺并没有消失而是加重了,且刘哥整体也加粗加重了,此时腐蚀也是黑色区域对白色区域进行腐蚀,腐蚀是有方向性的,黑色侵蚀白色。
此时如果我们想处理掉图像对应的毛刺,就需要与腐蚀相对应的膨胀操作。
2.图像的膨胀操作
OpenCV中的腐蚀操作的函数为:
erosion_img = cv2.dilate(img_ori, kernel, iterations=1)
其中img_ori为原图像,kernel为对应的滤波核,iterations为膨胀迭代操作的次数,erosion_img为膨胀操作后的图像。
我们使用膨胀操作来处理白色背景的黑字“刘哥”:
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\..\Pictures\Saved Pictures\liuge.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#腐蚀操作,黑色侵蚀白色
kernel = np.ones((5, 5), np.uint8)
dilate1= cv2.dilate(img, kernel, iterations=1)
cv2.imshow('dilate1', dilate1)
cv2.waitKey(0)
cv2.destroyAllWindows()
此时对图像膨胀后结果如下:
我们通过膨胀操作有效去除了图片中的毛刺,要想保留原图像中刘哥的字体大小粗细,我们可以再做一次反向操作,例如此图,我们就可以在进行一次腐蚀操作,如下:
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\..\Pictures\Saved Pictures\liuge.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#腐蚀操作,黑色侵蚀白色
kernel = np.ones((5, 5), np.uint8)
dilate1= cv2.dilate(img, kernel, iterations=1)
result = cv2.erode(dilate1, kernel, iterations=1)
cv2.imshow('result ', result )
cv2.waitKey(0)
cv2.destroyAllWindows()
先膨胀在腐蚀后的结果为:
通过先膨胀在腐蚀的操作,或先腐蚀在膨胀的操作(根据图像特点去判断)来去除图像中的一些划痕,污渍,毛刺等。