前言
在进行图像空域处理时,对于椒盐噪声的图像,中值滤波是一个很不错的选择,一般来说mask有矩形 椭形 和十字形,
十字形被认为在处理含有少数尖锥基元的图像更能保证尖锥的形状,由于没找到Matlab自带的函数库实现十字窗口,并且论坛上有极少的Opencv基于python的代码,大多还是付费的,于是自己写了一个模板,能够实现基本原理,至于效果和处理速度,有时间以后会进行优化。
2020.08.27:基本实现中值滤波十字窗口
2020.09.01:修复了8.27中除3×3窗口以外自定义窗口时图像显示错误的问题
中值滤波
中值滤波的原理很简单,不考虑图像填充,将一个框架,框在图像像素,框架上的像素数值按升降序排列,取中位数作为原像素点的新值。矩形的窗口都有专门的函数轻松实现,十字窗口则是以像素点为中心点,向四周直线发散,形成十字样式。
至于python上的实现逻辑,我将它分成RGB模式和Gray模式。
先说灰度模式,比较简单,它是一个二维张量,只需要用模板进行排序,通过基础的循环进行mask滑动,并且重新赋值即可。
RGB模式比灰度模式多了一步,将RGB图像是三维张量,先将其拆分成3个二维张量,然后再按照灰度模式的方法进行赋值,最后再进行图像合并。
目前代码的计算复杂度较高,还没有进行优化,彩色图像处理会花费较长时间。
更新:2020年09月01日 (修复自定义窗口大小问题)
修复了8.27日代码中只能实现3×3窗口十字滤波,更改窗口大小无法显示或显示错误的漏洞。
1.不需要指定色彩模式,只要是RGB或者灰度图可以直接传入函数
2.支持自定义框架大小
3.支持常数边界填充,也可以稍微改动进行OpenCV支持的所有填充方式
4.目前就写了十字窗口,所以type只支持十字类型
5.耗时间长效果未调试
def medfilter (pic,scale=[3,3],pad = [0,0,0],type='cross'):
'''
中值滤波器
pic 为被作用图片
type 为中值窗口类型 可选参数为 'cross'
scale 为窗口大小,如[3,3]
pad 为填充方法 输入值为一维矩阵
'''
import numpy as np
import cv2 as cv
#分别获取用于常数填充的四周填充的距离
top_bottom = int((scale[1]-1)/2)
left_right = int((scale[0]-1)/2)
#获取用于中值滤波窗口的中值位数(如3×3中,5个数排序后取第三个数)
mednum = (scale[1]+scale[0])/2-1
total_dim = np.shape(pic)
#获取图像的行列数据
pic_line = total_dim[

本文介绍了一种自定义窗口大小的十字形中值滤波器,适用于图像空域处理,尤其对椒盐噪声图像有良好效果。该滤波器支持RGB和灰度图像,实现了常数边界填充,可灵活调整窗口大小。
最低0.47元/天 解锁文章
1598

被折叠的 条评论
为什么被折叠?



