使用形态学梯度运算进行边缘检测(python)
1、opencv的形态学函数模块里morphologyEx函数提供了MORPH_GRADIENT让我们能够完成梯度运算。
数学方法: 膨胀操作与腐蚀的差。
具体实现有两种:
1)morphologyEx
2)根据定义: 膨胀 - 腐蚀
下面分别进行讨论。
此图为原图和叠加效果
2、还是以火箭为例
import numpy as np
import cv2 as cv
import copy
image = cv.imread('c:\\rocket.jpg')
cv.imshow("image", image)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
转成灰度
3、ret, thresholdImg = cv.threshold(gray, 170, 255, cv.THRESH_BINARY)
cv.imshow("thresholdImg", thresholdImg)
4、kernel = cv.getStructuringElement(cv.MORPH_CROSS,(5, 5))
#腐蚀图像
erodImg = cv.erode(thresholdImg, kernel)
#显示腐蚀后的图像
cv.imshow("erodImg1", erodImg)
#膨胀图像
dilateImg = cv.dilate(thresholdImg, kernel)
#显示膨胀后的图像
cv.imshow("dilateImg1", dilateImg)
5、方法一:
# 形态学梯度gradientImg = cv.morphologyEx(thresholdImg, cv.MORPH_GRADIENT, kernel)cv.imshow("gradientImg", gradientImg)
6、方法二:
#将两幅图像相减获得边,第一个参数是膨胀后的图像,第二个参数是腐蚀后的图像gradientImg2 = cv.subtract(dilateImg, erodImg)cv.imshow("gradientImg2", gradientImg2)
7、#对二值图每个像素取反 方便叠加
notImg = cv.bitwise_not(gradientImg)
cv.imshow("notImg", notImg)
叠加效果1
andImg1 = cv.bitwise_and(image, image, mask=gradientImg)
cv.imshow("andImg1", andImg1)
叠加效果2
andImg2 = cv.bitwise_and(image, image, mask=notImg)
cv.imshow("andImg2", andImg2)
cv.waitKey(0)cv.destroyAllWindows()