OpenCV与Python之图像形态学操作

目录

1. 图像腐蚀

2. 图像膨胀

3. 图像开运算

4. 图像闭运算

5. 图像梯度运算

6. 图像礼帽(顶帽)操作

7. 图像黑帽操作


原始图像下载

1. 图像腐蚀

原理:用一个全1的核去遍历整个图像,核中全是0或全是1的保持不变,核中只要出现一个1(白色)就将核的中心像素变为0。所以这样的操作会将图像(一般是二值化图像)白色局域变瘦小,黑色局域变多

命令:dst = cv2.erode(src, kernel, iterations)   # 默认迭代1次

生成一个全1的矩阵:kernel = cv2.getStructuringElement(方式,大小)

方式:矩形:cv2.MORPH_RECT; 交叉形:cv2.MORPH_CORSS; 椭圆形:cv2.MORPH_ELLIPSE

kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
# kernel = np.ones((5,5), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5)) 
# 矩形:MORPH_RECT, 交叉形:MORPH_CORSS, 椭圆形:MORPH_ELLIPSE
dst = cv2.erode(img, kernel, iterations=9)

OpenCV与Python之图像形态学操作

2. 图像膨胀

原理:与图像腐蚀相反, 用一个全1的核去遍历整个图像,核中全是0或全是1的保持不变,核中只要出现一个1(白色)就将核的中心像素变为1。所以这样的操作会将图像(一般是二值化图像)白色局域变多,黑色局域变少

命令:dst = cv2.dilate(src, kernel, iterations) # 默认迭代1次

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5)) 
dst = cv2.dilate(img, kernel, iterations=9)

OpenCV与Python之图像形态学操作

3. 图像开运算

原理:先腐蚀再膨胀,消除白色噪声

命令:dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)  # 效果通过改变核的大小来调节

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10, 10)) 
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

OpenCV与Python之图像形态学操作

4. 图像闭运算

 原理:先膨胀再腐蚀,消除黑色噪声

命令: dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10, 10)) 
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

OpenCV与Python之图像形态学操作

5. 图像梯度运算

原理:对图像分别做腐蚀操作和膨胀操作,然后用膨胀的结果减去腐蚀的结果,也就得到了图像的轮廓信息

命令: dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)  # 核越小边界约细

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5)) 
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

报错:cv2.error: OpenCV(4.0.1) d:\build\opencv\opencv-4.0.1\modules\core\src\matrix.cpp:757: error: (-215:Assertion failed) dims <= 2 && step[0] > 0 in function 'cv::Mat::locateROI' 

是因为没有读取到原图像,opencv不是因为找不到原图像而报错

OpenCV与Python之图像形态学操作

6. 图像礼帽(顶帽)操作

原理:先对图像进行开运算,得到去除噪声的结果,然后用原始图像减去开运算的结果,也就是的到原来图像中的白色噪声

命令:dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 核越大,噪声检测得越多,当然图像边界也被检测到了

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10, 10)) 
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

OpenCV与Python之图像形态学操作

7. 图像黑帽操作

原理:先对图像做闭运算,得到去除黑色噪声的结果,然后用闭运算的结果减去原始图像,也就得到了原图像中的黑色噪声

命令:dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)  # 核越大,检测到的黑色噪声越多,当然边界也被检测到了

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10, 10)) 
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

OpenCV与Python之图像形态学操作