一:膨胀和腐蚀

原始图像如下:

hw.png

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_高亮


hw_inv.png

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_迭代_02


如下展示代码:

import numpy as np
import random
import cv2
import matplotlib.pyplot as plt


# 展示图像,封装成函数
def cv_show_image(name, img):
cv2.imshow(name, img)
cv2.waitKey(0) # 等待时间,单位是毫秒,0代表任意键终止
cv2.destroyAllWindows()


# 第一部分:腐蚀和膨胀
# 腐蚀和膨胀的作用用途:
# 1:消除噪声;
# 2:分割出独立的图像元素,在图像中连接相邻的元素;
# 3:寻找图像中明显的极大值或极小值区;
# 3:求出图像的梯度;

# 操作一:腐蚀
# 腐蚀原理:局部最小值(与膨胀相反);
# 流程:
# 1:定义一个卷积核B,
# 核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
# 通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
# 2:将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值;
# 3:将这个最小值赋值给参考点指定的像素;
# 因此,图像中的高亮区域逐渐减小。
# 效果:
# 腐蚀是图像中的高亮部分被腐蚀掉,领域缩减,效果图拥有比原图更小的高亮区域;去掉毛刺儿(高亮的噪声)

# 先看看在相同核,不同迭代次数的情况下的效果
img = cv2.imread('images/hw.png') # 读取原始图像
print(img.shape)
# cv_show_image('img_src', img)

kernel = np.ones((5, 5), np.uint8)
erosion_it2r_1 = cv2.erode(img, kernel, iterations=1)
erosion_it2r_2 = cv2.erode(img, kernel, iterations=2)
erosion_it2r_3 = cv2.erode(img, kernel, iterations=3)

ret = np.hstack((erosion_it2r_1, erosion_it2r_2, erosion_it2r_3))
cv2.imshow('erosion_diff_iters', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 再看看在不同核,相同迭代次数的情况下的效果
kernel = np.ones((3, 3), np.uint8)
erosion_it2r_2 = cv2.erode(img, kernel, iterations=1)
kernel = np.ones((5, 5), np.uint8)
erosion_it2r_3 = cv2.erode(img, kernel, iterations=1)

ret = np.hstack((erosion_it2r_2, erosion_it2r_3))
cv2.imshow('erosion_diff_kernels', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()



# 操作二:膨胀
# 膨胀原理:求局部最大值;
# 流程:
# 1:定义一个卷积核B,
# 核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
# 通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
# 2:将核B与图像A进行卷积,计算核B覆盖区域的像素点最大值;
# 3:将这个最大值赋值给参考点指定的像素;
# 因此,图像中的高亮区域逐渐增长。
# 效果:
# 膨胀是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域;;去掉坑洞(黑点的噪声)
img = cv2.imread('images/hw_inv.png') # 读取原始图像
print(img.shape)
# cv_show_image('img_src', img)

kernel = np.ones((5, 5), np.uint8)
erosion_it2r_1 = cv2.dilate(img, kernel, iterations=1)
erosion_it2r_2 = cv2.dilate(img, kernel, iterations=2)
erosion_it2r_3 = cv2.dilate(img, kernel, iterations=3)

ret = np.hstack((erosion_it2r_1, erosion_it2r_2, erosion_it2r_3))
cv2.imshow('dilate_diff_iters', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 再看看在不同核,相同迭代次数的情况下的效果
kernel = np.ones((3, 3), np.uint8)
erosion_it2r_2 = cv2.dilate(img, kernel, iterations=1)
kernel = np.ones((5, 5), np.uint8)
erosion_it2r_3 = cv2.dilate(img, kernel, iterations=1)

ret = np.hstack((erosion_it2r_2, erosion_it2r_3))
cv2.imshow('dilate_diff_kernels', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

不同的迭代次数的腐蚀操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_高亮_03


不同的核大小的腐蚀操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_opencv_04


不同的迭代次数的膨胀操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_迭代_05

不同的核大小的膨胀操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_高亮_06

二:开运算和闭运算

# 开运算:先腐蚀再膨胀,能去掉高亮的噪音毛刺儿后,还原回来。
img = cv2.imread('images/hw.png') # 读取原始图像
print(img.shape)
# cv_show_image('img_src', img)

kernel = np.ones((3, 3), np.uint8)
MORPH_OPEN_1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
kernel = np.ones((5, 5), np.uint8)
MORPH_OPEN_2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

ret = np.hstack((MORPH_OPEN_1, MORPH_OPEN_2))
cv2.imshow('morphologyEx_open_diff_kernels', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 闭运算:先膨胀再腐蚀,能去掉黑暗点的噪音毛刺儿后,还原回来。
img = cv2.imread('images/hw_inv.png') # 读取原始图像
print(img.shape)
# cv_show_image('img_src', img)

kernel = np.ones((3, 3), np.uint8)
MORPH_OPEN_1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
kernel = np.ones((5, 5), np.uint8)
MORPH_OPEN_2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

ret = np.hstack((MORPH_OPEN_1, MORPH_OPEN_2))
cv2.imshow('morphologyEx_close_diff_kernels', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

不同的核大小的开运算操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_python_07


不同的核大小的闭运算操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_高亮_08

三:礼帽和黑帽

# 礼帽运算:原始输入图像减去开运算结果,能得到所有的高亮的噪音毛刺儿
img = cv2.imread('images/hw.png') # 读取原始图像
print(img.shape)
# cv_show_image('img_src', img)

kernel = np.ones((3, 3), np.uint8)
MORPH_TOPHAT_1 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
kernel = np.ones((5, 5), np.uint8)
MORPH_TOPHAT_2 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

ret = np.hstack((MORPH_TOPHAT_1, MORPH_TOPHAT_2))
cv2.imshow('morphologyEx_tophat_diff_kernels', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 黑运算:闭运算结果减去原始输入图像,能得到所有的黑色点的噪音毛刺儿
img = cv2.imread('images/hw_inv.png') # 读取原始图像
print(img.shape)
# cv_show_image('img_src', img)

kernel = np.ones((3, 3), np.uint8)
MORPH_BLACKHAT_1 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
kernel = np.ones((5, 5), np.uint8)
MORPH_BLACKHAT_2 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

ret = np.hstack((MORPH_BLACKHAT_1, MORPH_BLACKHAT_2))
cv2.imshow('morphologyEx_blackhat_diff_kernels', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

不同的核大小的礼帽运算操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_python_09

不同的核大小的黑帽开运算操作效果如下:

【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】_计算机视觉_10