目录
1. 介绍
2. code
1. 介绍
灰度级形态学将形态学在二值图像的处理中扩展到灰度图像
灰度腐蚀:得到kernel 处理子区域的最小值
因此:灰度腐蚀后的图像整体偏暗,并且亮特征减少
灰度膨胀:得到kernel 处理子区域的最大值
同二值图像 膨胀运算一样,需要将结构元先反射,绕原点选择180。但通常使用的结构元都是对称的,因此可以不用考虑反射的问题
因此:灰度膨胀后的图像整体偏亮,并且暗特征减少
?灰度腐蚀就是统计排序滤波器里面的最小值滤波器
?灰度膨胀就是统计排序滤波器里面的最大值滤波器
2. code
首先将?空间滤波-统计排序滤波器?里面的算法代码拷贝
import cv2
import numpy as np
def statistical_sorting_filter(img, kernel_size=3, transform='median'):
height, width = img.shape[:2] # 获取图像的长宽
ksize = kernel_size # 滤波器的size
pad = int((ksize - 1) / 2) # padding 的大小
img_pad = np.pad(img, pad, mode="edge") # 将原图进行边缘上的填充
for i in range(pad, pad + height): # 遍历img_pad 图像的点,将滤波后的带能赋值给原图img对应位置
for j in range(pad, pad + width):
value = img_pad[i - pad:i + pad + 1, j - pad:j + pad + 1] # 取出子区域
if transform == 'max': # 最大值滤波
img[i - pad][j - pad] = np.max(value)
if transform == 'min': # 最小值滤波
img[i - pad][j - pad] = np.min(value)
return img.astype(np.uint8)
img = cv2.imread('./flower.jpg', 0)
img_ssf_min = statistical_sorting_filter(img.copy(), transform='min') # 统计滤波器处理-min
img_ssf_max = statistical_sorting_filter(img.copy(), transform='max') # 统计滤波器处理-max
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
img_erode = cv2.erode(img,kernel) # 腐蚀
img_dilate = cv2.dilate(img,kernel) # 膨胀
cv2.imshow('erode', np.hstack((img,img_ssf_min,img_erode)))
cv2.imshow('dilate', np.hstack((img,img_ssf_max,img_dilate)))
cv2.waitKey()
cv2.destroyAllWindows()
处理结果为:
图像顺序:原图、统计排序滤波器的min滤波、腐蚀图
?图像顺序:原图、统计排序滤波器的max滤波、膨胀图
处理的结果是一样的
?
|