目录
1. 介绍
2. 代码实现
3. code
1. 介绍
本章内容介绍的是修正阿尔法均值滤波器,它也是属于统计排序滤波器的一种。和之前的统计排序滤波不同的是,修正阿尔法均值滤波器会将kernel处理的邻域中灰度值较低和较高的像素点删除,类似于计算平均分的时候,去掉最高分和最低分
修正阿尔法均值滤波器的表达式为:
其中mn代表kernel的sized 代表要删除像素点的个数(修正阿尔法均值滤波器会将滤波器处理的子区域像素点的灰度值升序排列,然后去掉最小的d / 2 和最大的d / 2 的像素点)
特殊使用:由公式不难看出,d取值范围是0 ~ mn - 1,建议取偶数
d = 0 ,修正阿尔法均值滤波器 简化为 算术均值滤波器d = mn - 1,修正阿尔法均值滤波器 简化为 中值滤波器d 取其他值的时候,适合于处理多种混合噪声,例如高斯噪声和椒盐噪声
2. 代码实现
实现的原理较为简单,这里只做部分讲解,详细的可以看空间滤波-几何均值滤波器
再for 循环的内部,就是滤波器处理的部分,具体步骤为
1. 先是取出滤波器处理的区域,取出所有值value,大小为滤波器的size
2. 对子区域像素的灰度值进行排序
3. 将左右两侧的灰度值剔除(其实就是切片),然后求和 ret
4. 代入公式 ret / (mn -d)
3. code
修正阿尔法均值滤波器 实现代码:
import cv2import numpy as npdef modified_alpha_mean_filter(img,kernel_size = 3,d = 8):height, width = img.shape[:2] # 获取图像的长宽ksize = kernel_size # 滤波器的sizepad = 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] # 取出子区域value_sort = np.sort(value.flatten()) # 对子区域根据灰度值排序ret = np.sum(value_sort[int(d / 2):ksize*ksize - int(d / 2)]) # 取出删减的值(删除前 d /2,后 d / 2)img[i-pad][j-pad] = ret / (ksize*ksize - d) # 赋值return img.astype(np.uint8)img = cv2.imread('./img_noise.jpg',0)img_copy = img.copy() # 拷贝原图d_2 = modified_alpha_mean_filter(img.copy(),d = 2) # 滤波器处理d_4 = modified_alpha_mean_filter(img.copy(),d = 4) # 滤波器处理d_8 = modified_alpha_mean_filter(img.copy(),d = 8) # 滤波器处理 == 中值滤波dst = cv2.medianBlur(img_copy,3) # 中值滤波器cv2.imshow('img',np.hstack((img_copy,d_2,d_4,d_8,dst)))cv2.waitKey()cv2.destroyAllWindows()
输出结果:
图像顺序:原图,d = 2 ,d =4,d =8的处理图像,中值滤波处理的图像
因为这里修正阿尔法均值滤波器的kernel size 是3*3的,所以d = 8的时候,修正阿尔法均值滤波器应该简化为中值滤波器。不难发现,和中值滤波处理的结果是一样的
这里修正阿尔法均值滤波器实现的时候,传入的是img,返回的也是img,也就是说我们会改变输入图像,所以多次传入的时候,要传入img的拷贝