机器视觉——OpenCV案例分析基础(六)(基于图像处理的数学形态学)

12 篇文章 3 订阅
12 篇文章 8 订阅

一、理论分析

图像的形态学包括图像腐蚀、图像膨胀、图像的开运算、图像的闭运算、图像的梯度、礼帽运算、黑帽运算。而形态学转换中主要针对的是二值图像。它需要两个输入对象。

  1. 二值图像
  2. 卷积核

二、代码分析

2.1 图像腐蚀

顾名思义,图像腐蚀会导致图像会变小。扫描图像的每个像素点,每个像素点对应一个卷积核,如果这个卷积核的值都为1,那么该像素点值为1,否则为0。

from cv2 import cv2 as cv
import numpy as np

img = cv.imread(r'./CV-Pictures/spider2.png')
# img = np.zeros((600,600),np.uint8)
# cv.circle(img,(300,300),120,(255,255,255),-1)
# kernel = np.ones((55,55),np.uint8)
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5)) #结构内核椭圆
# kernel = cv.getStructuringElement(cv.MORPH_RECT,(55,55)) #矩形
# kernel = cv.getStructuringElement(cv.MORPH_CROSS,(5,75)) #十字架
erode_img = cv.erode(img,kernel,iterations=1) #图像腐蚀函数,iteration代表迭代次数
pic = np.hstack([img,erode_img])
cv.imshow("erode_img",pic)
cv.waitKey(0)
cv.destroyAllWindows()

代码运行结果如下:
在这里插入图片描述

2.2 图像膨胀

from cv2 import cv2 as cv
import numpy as np

# img = cv.imread(r"./CV-Pictures/dilation.bmp")
# cv.imshow("img",img)
# kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
# dilate_img = cv.dilate(img,kernel)
# cv.imshow("dilate_img",dilate_img)
img = np.zeros((600,600),np.uint8) #新建画板,大小600*600,黑色
cv.circle(img,(300,300),120,(255,255,255),-1) #画圆,圆心为300,300,半径120,颜色白色,实心圆
cv.rectangle(img,(50,50),(180,120),(255,255,255),-1) #画矩形,左下角50,50,右上角180,120.白色,实心圆。

kernel = cv.getStructuringElement(cv.MORPH_RECT,(90,90)) #核为矩形90*90
# kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(60,60))
dilate_img = cv.dilate(img,kernel) #图像膨胀函数
pic = np.hstack([img,dilate_img]) #矩阵水平相连
cv.imshow("dilate_img",pic)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

2.3 图像的开运算

通俗来讲就是去毛细,即把蜘蛛腿去掉。过程可以理解为先腐蚀后膨胀。

from cv2 import cv2 as cv
import numpy as np
#去毛细 先腐蚀后膨胀 erode dilate
img = cv.imread(r"./CV-Pictures/opening.bmp")
kernel = np.ones((9,9),np.uint8)
open_img = cv.morphologyEx(img,cv.MORPH_OPEN,kernel)
cv.imshow("img",img)
cv.imshow("open_img",open_img)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
在这里插入图片描述
在这里插入图片描述
可以看到,图像经过腐蚀后,本来的毛细被去除,同时图形的形状也窄了一圈,然后经过图像的膨胀后,图像的形状又基本与原来的形状保持一致,从而达到了去除图形毛细的效果。开运算,可以理解为,图形最后打开,即膨胀,也记为先腐蚀后膨胀。

2.4 图像的闭运算

通俗来讲就是去小孔 即先膨胀,后腐蚀。

#去小孔 先膨胀,后腐蚀
from cv2 import cv2 as cv
import numpy as np

img = cv.imread(r"./CV-Pictures/closing.bmp")
kernel = np.ones((11,11),np.uint8)
close_img = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel)
cv.imshow("img",img)
cv.imshow("close_img",close_img)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
可以看到图像经过闭运算后,图像的小孔基本被去除。具体做法是图像先经过膨胀后,去除小孔。但是同时图像会大了一圈。然后经过图像的腐蚀,图像的形状有基本与全图保持一致,从而实现了,去除图像的小孔。
在这里插入图片描述

2.5 图像的梯度

图像的梯度,顾名思义梯度公式为 ▽ f = f ( x + △ x ) − f ( x ) △ x \bigtriangledown f= \frac{f(x+\bigtriangleup x)-f(x)}{\bigtriangleup x} f=xf(x+△x)f(x)做的是减法。

#空心 膨胀-腐蚀
from cv2 import cv2 as cv
import numpy as np

img = cv.imread(r"./CV-Pictures/044.jpg")
kernel = np.ones((11,11),np.uint8)
grad_img = cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel)
cv.imshow("img",img)
cv.imshow("grad_img",grad_img)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
可以看到图像经过梯度运算后,获得的图像是形状的边缘,运算过程是先计做出膨胀的图像,然后做出腐蚀的图像。然后用膨胀的图像减去腐蚀的图像。即可获得一个空心的图像。
在这里插入图片描述

2.6 礼帽运算

礼帽运算的基本原则是获得蜘蛛图像的被腐蚀的部分。也就是说原图减去开运算图像。获得图像的毛细特征。

from cv2 import cv2 as cv
import numpy as np

img = cv.imread(r"./CV-Pictures/spider.png")
#img = cv.imread("CV-Pictures/036.jpg")
kernel = np.ones((11,11),np.uint8)
tophat_img = cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
pic = np.hstack([img,tophat_img])
cv.imshow("tophat_img",pic)
cv.waitKey(0)
cv.destroyAllWindows()

代码运行结果
在这里插入图片描述

2.7 黑帽运算

黑帽运算的基本原则是获得去掉的小圆圈,也就是说闭运算图像减去原始图像。获得图像的小圆圈特征。

#取空的 填空的(闭运算)-原始
from cv2 import cv2 as cv
import numpy as np

img = cv.imread(r"./CV-Pictures/blackhat.bmp")
# img = cv.imread("CV-Pictures/036.jpg")
kernel = np.ones((11,11),np.uint8)
blackhat_img = cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
pic = np.hstack([img,blackhat_img])
cv.imshow("blackhat_img",pic)
cv.waitKey(0)
cv.destroyAllWindows()

代码运行结果:
在这里插入图片描述

三、代码文件

小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。
链接:https://pan.baidu.com/s/1Ce14ZQYEYWJxhpNEP1ERhg?pwd=7mvf
提取码:7mvf

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值