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()

可以看出,同大小的结构元素,去除白噪点,使用矩形结构元素效果最佳。当然,去除白点的效果,还跟所选取的结构大小有关。
opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())_第1张图片

二、闭操作

  • 闭操作(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()

同样可以看出,同大小的结构元素,填补黑点,使用矩形结构元素效果最佳,去除黑点的效果,还跟所选取的结构大小有关。
opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())_第2张图片

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

三、形态学梯度

  • 形态学梯度(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()

越小的结构元素,提取边缘的时候越精细。
opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())_第4张图片

四、顶帽

  • 顶帽(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()

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

五、黑帽

  • 黑帽(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()

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

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