opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())

形态学处理【二】

  • 开操作、闭操作、形态学梯度、顶帽变换、黑帽变换
  • 相关函数有:cv2.morphologyEx()、cv2.getStructuringElement()
  • 有趣的应用:去除皮肤镜中的毛发噪音

一、开操作

  • 开操作(open):先腐蚀后膨胀。

  • 作用

    • 可以去掉小的白噪点,填充小的白洞。
    • 能排除小区域物体、消除孤立点、去噪、平滑物体的轮廓
    • 用于移除一些小物体或者小亮斑点。

如下假设对象是前景色,背景是黑色,腐蚀可把小白点去掉,膨胀又把主对象被腐蚀掉的部分还原回来。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('open.jpg',1)

# cv2.getStructuringElement()来生成不同形状的结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) # 十字结构

# 使用不同结构元素  执行开操作
opening1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel1)
opening2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel2)
opening3 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel3)

# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(141),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(142),plt.imshow(opening1),plt.title('RECT'),plt.xticks([]), plt.yticks([])
plt.subplot(143),plt.imshow(opening2),plt.title('ELLIPSE'),plt.xticks([]), plt.yticks([])
plt.subplot(144),plt.imshow(opening3),plt.title('CROSS'),plt.xticks([]), plt.yticks([])
plt.show()

可以看出,同大小的结构元素,去除白噪点,使用矩形结构元素效果最佳。当然,去除白点的效果,还跟所选取的结构大小有关。

二、闭操作

  • 闭操作(close):先膨胀后腐蚀(bin2)

  • 作用

    • 可以填充小的黑洞(fill hole补洞),去掉小的黑噪点。
    • 填充目标区域内的离散小空洞和分散部分。

如下假设对象是前景色,背景是黑色.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('cell.jpg',1)

# cv2.getStructuringElement()来生成不同形状的结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 矩形结构
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10)) # 椭圆结构
kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10)) # 十字结构

# 使用不同结构元素  执行闭操作
closing1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel1)
closing2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel2)
closing3 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel3)

# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(141),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(142),plt.imshow(closing1),plt.title('RECT'),plt.xticks([]), plt.yticks([])
plt.subplot(143),plt.imshow(closing2),plt.title('ELLIPSE'),plt.xticks([]), plt.yticks([])
plt.subplot(144),plt.imshow(closing3),plt.title('CROSS'),plt.xticks([]), plt.yticks([])
plt.show()

同样可以看出,同大小的结构元素,填补黑点,使用矩形结构元素效果最佳,去除黑点的效果,还跟所选取的结构大小有关。

再比如,去除皮肤镜像中的毛发噪音。

三、形态学梯度

  • 形态学梯度(Gradient):膨胀减去腐蚀,又称为基本梯度。其实就是一幅图像膨胀与腐蚀的差别结果看上去就像前景物体的轮廓。

  • 作用: 边缘提取。对二值图像进行这一操作,可以将团块(blob)的边缘突出出来,保留物体的边缘轮廓。

  • 其它还有内部梯度(原图减去腐蚀)、外部梯度(膨胀减去原图)、方向梯度(x方向和y方向进行计算)

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('tiger.jpg',1)

# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) # 矩形结构


# 执行梯度操作
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)


# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(121),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(gradient),plt.title('gradient'),plt.xticks([]), plt.yticks([])
plt.show()

越小的结构元素,提取边缘的时候越精细。

四、顶帽

  • 顶帽(top hat):是原图像与开操作之间的差值图像。

  • 原始图像与进行开运算之后得到的图像的差。

  • 作用:显示开操作所去掉的小白噪点

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('open.jpg',1)

# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构

# 执行开、顶帽操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(opening),plt.title('opening'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(tophat),plt.title('tophat'),plt.xticks([]), plt.yticks([])
plt.show()

五、黑帽

  • 黑帽(black hat):闭操作图像与源图像的差值图像

  • 作用:显示闭操作所填充的小黑洞,或者是闭操作去除的东西

下面,以闭操作中去除的毛发噪音为例,我们使用黑帽将其显示出来

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('cell.jpg',1)

# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 矩形结构

# 执行闭、顶帽操作
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(closing),plt.title('closing'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(blackhat),plt.title('blackhat'),plt.xticks([]), plt.yticks([])
plt.show()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值