opencv —— morphology形态学操作函数讲解(python)

opencv —— morphology形态学操作函数讲解

目录

opencv —— morphology形态学操作函数讲解

形态学滤波:morphologyEx 函数

开运算:先腐蚀后膨胀。

闭运算:先膨胀后腐蚀。

形态学梯度: 膨胀图与腐蚀图之差。

顶帽:顶帽运算(Top Hat)又常常被译为”礼帽“运算,原图像与开运算图之差。

黑帽: 为”闭运算“的结果图与原图像之差。


参考博客1

参考博客2

数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。

morphology形态学操作函数主要包含了五个操作:开运算、闭运算、形态学梯度、顶帽、黑帽。opencv 将这些操作集合到了一个函数中 morphologyEx。要实现不同操作,仅需改变其第三个成员变量形态学运算标识符。 

形态学滤波:morphologyEx 函数

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue());
  • src,输入图像,即原图像,填 Mat 类的对象即可。
  • dst,目标图像,需要和原图片有一样的尺寸和类型。
  • op,形态学运算的类型。

MORPH_ERODE = 0, //腐蚀

MORPH_DILATE = 1, //膨胀

MORPH_OPEN = 2, //开操作

MORPH_CLOSE = 3, //闭操作

MORPH_GRADIENT = 4, //梯度操作

MORPH_TOPHAT = 5, //顶帽操作

MORPH_BLACKHAT = 6, //黑帽操作

  • kernel,膨胀操作的核。当为 NULL 时,表示的是使用参考点位于中心,大小 3×3 的核。
  • anchor,锚点的位置,默认位于中心。
  • iterations 迭代使用 dilate() 的次数,默认值为 1。
  • borderType,边界拓展的方法。
  • borderValue,当边界为常数时的边界值,有默认值,一般不用管。

开运算:先腐蚀后膨胀。

开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='Greys_r')
kernel = np.ones((1, 5), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, anchor=(2, 0), iterations=2) #dilatazione
cv2.imshow('open',img)
cv2.waitKey(0)

截图

闭运算:先膨胀后腐蚀。

闭运算能够排除小型黑洞(黑色区域),可以将团块的边缘突出出来。

代码演示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='Greys_r')

kernel = np.ones((1, 5), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, anchor=(2, 0), iterations=2) #dilatazione
cv2.imshow('close',img)
cv2.waitKey(0)

截图

形态学梯度: 膨胀图与腐蚀图之差。

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。

代码演示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='Greys_r')

kernel = np.ones((1, 5), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, anchor=(2, 0), iterations=2) #dilatazione
cv2.imshow('MORPH_GRADIENT',img)
cv2.waitKey(0)

截图:

顶帽:顶帽运算(Top Hat)又常常被译为”礼帽“运算,原图像与开运算图之差。

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,所以顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

代码演示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='Greys_r')

kernel = np.ones((1, 5), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, anchor=(2, 0), iterations=2) #dilatazione
cv2.imshow('MORPH_TOPHAT',img)
cv2.waitKey(0)

截图:

黑帽: 为”闭运算“的结果图与原图像之差。

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,黑帽运算用来分离比邻近点暗一些的斑块。

代码演示:

 

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='Greys_r')
kernel = np.ones((1, 5), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, anchor=(2, 0), iterations=2) #dilatazione
cv2.imshow('MORPH_BLACKHAT',img)
cv2.waitKey(0)

截图

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
形态学图像处理是一种基于数学形态学原理的图像处理方法,可以用于图像的特征提取、边缘检测、形状分析等。在Python中,有多种库可以进行形态学图像处理,如OpenCV和scikit-image。 在OpenCV中,可以使用cv2.morphologyEx函数进行形态学图像处理。其中,可以使用cv2.MORPH_GRADIENT参数来进行形态学梯度操作,即膨胀图与腐蚀图之差。下面是一个使用OpenCV进行形态学梯度操作的示例代码: ```python import numpy as np import cv2 # 读取输入图像 img = cv2.imread('g1.png') # 定义卷积核 kernel = np.ones((6,6), dtype="uint8")/9 # 进行形态学梯度操作 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # 保存结果图像 cv2.imwrite('gradient.jpg', gradient) ``` 另外,scikit-image库也提供了一些形态学图像处理的函数。可以使用skimage.morphology模块中的函数进行膨胀、腐蚀等操作。下面是一个使用scikit-image进行膨胀与腐蚀操作的示例代码: ```python from skimage.morphology import erosion, dilation from skimage.morphology import square from skimage.color import rgb2gray from skimage.io import imread # 读取输入图像并转为灰度图像 im = imread('zebras.jpg', as_gray=True) # 进行腐蚀操作 selem = square(5) eroded = erosion(im, selem) # 进行膨胀操作 dilated = dilation(im, selem) ``` 以上是使用OpenCV和scikit-image库进行形态学图像处理的示例代码,你可以根据自己的需求选择合适的库和函数进行图像处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月蹉跎的一杯酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值