Python图像处理笔记——形态学处理(skimage.morphology)


一、前言

算法类型:
膨胀、腐蚀、开运算、闭运算、梯度运算、礼帽运算、黑帽运算,击中与击不中变换

应用:

  • 消除噪声、提取边界、填充区域、提取连通分量、凸壳、细化、粗化等;
  • 分割出独立的图像元素,或者图像中相邻的元素;
  • 求取图像中明显的极大值区域和极小值区域;
  • 求取图像梯度等等

1. 腐蚀(Erode)

将物体的边缘加以腐蚀。拿一个宽m高n的矩形作为kernel,对图像中的每一个像素进行扫描,扫描后的图像的每个像素点和原图的位置对应,同时和扫描时kernel的中心点对应。

用kernel遍历原图的所有像素,每遍历一次就将对应位置的像素点更改为kernel中的最小值。

与操作也就是最小值替换中心像素。

  • 对象大小减少1个像素(3*3)
  • 平滑对象边缘
  • 弱化或者分割图像之间的半岛型连接

2. 膨胀(Dilata)

腐蚀的反操作:膨胀能对图像的边界进行扩展,就是将图像的轮廓加以膨胀。

用kernel遍历原图的所有像素,每遍历一次就将对应位置的像素点更改为kernel中的最大值。

或操作也就是最大值替换中心像素

  • 对象大小增加一个像素(3*3)
  • 平滑对象边缘
  • 减少或者填充对象之间的距离

3. 其他

腐蚀和膨胀是图像形态学运算的基础,将膨胀和腐蚀进行组合就得出开闭运算、梯度、礼帽、黑帽等不同形式的运算:

开运算: 先腐蚀后膨胀
闭运算: 先膨胀后腐蚀
形态学梯度: 膨胀图-腐蚀图
礼帽运算: 也叫顶帽运算,原始图像-开运算结果
黑帽运算: 闭运算结果-原始图像
击中不击中: 前景、背景腐蚀运算的交集

二、Python实现

skimage库

1.引入库

from skimage.morphology import erosion, dilation, opening, closing, white_tophat
from skimage.morphology import black_tophat, skeletonize, convex_hull_image
from skimage.morphology import disk, square, diamond
from skimage.color import rgb2gray
from skimage.util import img_as_ubyte

2. 膨胀与腐蚀

im = imread('zebras.jpg', as_gray=True)
im = rgb2gray(im)
selem = square(5) #square(2)  # #square(4) #disk(6)
# 腐蚀
eroded = erosion(im, selem)
# 膨胀
dilated = dilation(im, selem)

在这里插入图片描述

不同类型的核腐蚀

在这里插入图片描述

不同大小的核腐蚀(disk)

在这里插入图片描述

3. 开运算和闭运算

开运算可以去噪、计数等。比如识别一张图像中有几个人,要先把人和人重叠的部分分开,然后再计数。

闭运算可以去除前景物内部的黑点,还可以将不同前景图像进行连接,就是实现前景图像的连接。

def showImages(images, n, m, titles):
    plt.figure(figsize=(10, 10))
    plt.gray()
    i = 1
    for image in images:
        plt.subplot(n, m, i)
        plt.imshow(image)
        plt.title(titles[i - 1])
        i += 1
    plt.show()
    
images = [im]
titles = ['original', 'open', 'close']
images.append(opening(im, square(5)))
images.append(closing(im, square(5)))
showImages(images, 1, 3, titles)

腐蚀、膨胀、开运算、闭运算的区别:
在这里插入图片描述
在这里插入图片描述

4. 形态学梯度

可以获得图像的边缘信息

gradientImage=dilation(im, square(2)) - erosion(im, square(2))

在这里插入图片描述

5. 白帽和黑帽

白帽运算是原图-开运算图,可以获得图像的噪声或者比原始图的边缘更亮的边缘信息
黑帽运算是闭运算图像-原图,可以获得图像的内部噪声或者比原始图的边缘更暗的边缘信息。

images = [im]
titles = ['原图', '白帽', '黑帽']
images.append(im-opening(im, square(5)))
# images.append(white_tophat(im,square(5)))
images.append(closing(im, square(5))-im)
# images.append(black_tophat(im,square(5)))
showImages(images, 1, 3, titles)

在这里插入图片描述

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值