一、前言
算法类型:
膨胀、腐蚀、开运算、闭运算、梯度运算、礼帽运算、黑帽运算,击中与击不中变换
应用:
- 消除噪声、提取边界、填充区域、提取连通分量、凸壳、细化、粗化等;
- 分割出独立的图像元素,或者图像中相邻的元素;
- 求取图像中明显的极大值区域和极小值区域;
- 求取图像梯度等等
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)