OpenCV--图像的形态学处理
2020-11-20 本文已影响0人
Dayon
腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,形象理解一些:
腐蚀=变瘦
膨胀=变胖主要是采用 cv2.erode() 和 cv2.dilate()
主要针对二值化图像的白色部分
腐蚀 (erosion /ɪˈroʊʒən/ 🔉):是一种消除边界点,使边界向内部收缩的过程
- 通俗讲法:在原图的每一个小区域里取最小值,由于是二值化图像,只要有一个点为0,则都为0,来达到瘦身的目的
算法:用 3x3 的 kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为1,则图像的该像素为1;否则为0. 最终结果:使二值图像减小一圈.膨胀 (dilate /ˈdaɪˌleɪt/ 🔉 ):是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,可以用来填补物体中的空洞.
- 算法:用 3x3 的 kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为0,则图像的该像素为0;否则为1. 最终结果:使二值图像扩大一圈
开运算:先腐蚀后膨胀的过程 。
用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.【cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)】闭运算:先膨胀后腐蚀的过程 。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积.【cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)】
梯度运算:膨胀 -> 腐蚀的过程 。用来计算轮廓【cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)】
顶帽:原始输入 - 开运算结果 【cv2.morphologyEx(img,cv.MORPH_TOPHAT,kernel)】
黑帽:闭运算 - 原始输入 【cv2.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)】
iteration /ˌɪt̬.əˈreɪ.ʃən/ : 迭代
腐蚀/膨胀操作
import cv2
import numpy as np
img = cv2.imread('dige.png')
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1) # 迭代次数越多 和 kernel越大 效果越明显
dilate = cv2.dilate(img,kernel,iterations = 1)
res = np.hstack((img,erosion,dilate))
cv_show('dige and erode and dilate',res)
![](https://img.haomeiwen.com/i1316211/2d65c641d72e7918.png)
pie = cv2.imread('pie.png')
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res_e = np.hstack((pie,erosion_1,erosion_2,erosion_3))
res_d = np.hstack((pie,dilate_1,dilate_2,dilate_3))
# cv2.imshow('res', res_e)
cv2.imwrite('pie_erode_res.jpg',res_e)
cv2.imwrite('pie_dilate_res.jpg',res_d)
cv2.waitKey(0)
cv2.destroyAllWindows()
![](https://img.haomeiwen.com/i1316211/7cf204d2623b0346.png)
开运算&闭运算
- 开:先腐蚀,再膨胀
- 闭:先膨胀,再腐蚀
import cv2
import numpy as np
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) # 开:把刺去掉了
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) # 闭:字和刺都胖了
result = np.hstack((img,opening,closing))
cv2.imshow('open and close',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
morphology /moɚˈfɑːləʤi/ 🔉:形态学
import cv2
import numpy as np
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) # 开:把刺去掉了
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) # 闭:字和刺都胖了
result = np.hstack((img,opening,closing))
cv2.imshow('open and close',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
![](https://img.haomeiwen.com/i1316211/c188476a720fec6b.png)
梯度运算
- 梯度 = 膨胀-腐蚀
多出来的白边 减去 减少的白边,即计算一个轮廓出来
gradient /ˈgreɪdijənt/ 🔉 :梯度
# 梯度= 膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)
gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
res = np.hstack((dilate,erosion,gradient))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
![](https://img.haomeiwen.com/i1316211/e44da016435f1af2.png)
礼帽&黑帽
- 礼帽 = 原始输入 - 开运算结果 (原图 - 没刺的 = 剩下刺)
- 黑帽 = 闭运算 - 原始输入 (字和刺胖了的 - 原图 = 胖的边缘部分)
img = cv2.imread('dige.png')
kernel = np.ones((7,7),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 只剩刺了
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) # 只剩白边的轮廓
res = np.hstack((img,tophat,blackhat))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
![](https://img.haomeiwen.com/i1316211/711023773d403015.png)