图像的平滑处理

一、图像的平滑处理

基本概念

图像在获取、传输的过程中,可能会受到干扰的影响,会产生噪声,噪声是一种出错了的信号,噪声会造成图像粗糙,需要我们对图像进行平滑处理。图像去噪是一种信号滤波的方法,目的就是为了保留有用的信号。

噪声的基本特点就是灰度值不相关、空间位置都是随机的

平滑的目的
1. 模糊:在提取大目标之前,去除太小的细节。将目标内的小间断点连接起来
2.消除噪声:改善图像质量,降低干扰。

平滑滤波对图像的低频分量增强,同时会消弱高频分量。用于消除图像中的随机噪声,起到平滑作用

基本方法

本节的方法主要是运用在空间域内,所谓空间域就是指直接在像素坐标处对其值进行操作。相应的,还有频域法,所谓频域法就是通过傅里叶变换拉普拉斯变化,将图像数据映射到频域里,然后滤除噪声的频率,再把数据映射回空间域。

空间滤波增强技术,都是基于模板进行的,模板也叫做滤波器掩膜,窗口。用某一模板对每个像元与其周围邻域的所有像元进行某种数学运算,得到该像元新的灰度值。新的灰度值不仅与该像元的灰度值有关,还与其邻域内的像元的灰度值有关。

实际上,模板的大小是可以人为确定的,可以3 * 3,也可以5 * 5。但一定是要是奇数,各种系数也可以通过我们的需要来确定。

图像平滑,有以下三种基本方法

1.线性平滑:每一个像素的灰度值用它的邻域值代替,邻域为NXN,N取奇数。

2.非线性平滑:改进,取一个阈值,当像素值与其邻域平均值之间的差大于阈	值,以均值代替;反之.取其本身值。

3.自适应平滑:物体边缘在不同的方向上有不同的统计特性,即不同的均值和方差,为保留一定的边缘信息,采用自适

在这里插入图片描述

什么是卷积运算
卷积运算卷积,就是作加权求和的过程。卷积核就是模板模板,大小与邻域相同。邻域中的每个像素分别与卷积核中的每–个元素相乘,求和结果即为中心像素的新值。卷积核中的元素称作加权系数(卷积系数),系数的大小及 排列顺序,决定了处理的类型。改变加权系数与符号,影响新值。我们这里所说的卷积与复变函数中的卷积公式有所差比,但表达的意思都是一样的,都是想进行加权求和

当模板在图像移动时候,遇到没有领域的像素该如何处理?

  1. 最简单的处理方法就是忽略这些像素,不去计算他
  2. 在图像周围再复制一圈原图像的边界像素值
  3. 如果我们计算出来的值超过255,我们将超过范围的值重新再人为指定一个值

滤波器介绍

1 9 [ 1 1 1 1 1 1 1 1 1 ] ( 均 值 滤 波 ) \frac{1}{9}\begin{bmatrix} 1 &1 &1 \\ 1 &1 &1 \\ 1& 1 & 1 \end{bmatrix} (均值滤波) 91111111111

1 16 [ 1 2 1 2 4 2 1 2 1 ] ( 高 斯 型 滤 波 ) \frac{1}{16}\begin{bmatrix} 1 &2 &1 \\ 2 &4 &2 \\ 1& 2 & 1 \end{bmatrix} (高斯型滤波) 161121242121

1 8 [ 1 1 1 1 1 1 1 0 1 ] ( 去 黑 白 点 噪 声 滤 波 ) \frac{1}{8}\begin{bmatrix} 1 &1 &1 \\ 1&1 &1 \\ 1& 0 & 1 \end{bmatrix} (去黑白点噪声滤波) 81111110111()

二、python代码实现

因为滤波器可以有很多个,不同的滤波也有不同的处理方式,所以我将对于滤波的处理方式,单独抽象出来,形成一个接口,可以方便定制。

    def filter(self,v,handle):
        #首先判断滤波器的大小
        width = len(v)  # 得到滤波器大小
        assert len(v)==len(v[0]),'滤波器不合乎规范'
        assert width%2!=0,'滤波器边长必须为奇数'
        v_w=int(width/2) #得到中心像元边界的大小
        img_buf=np.copy(self.Img) #开辟一个图像缓存区
        # 对可以使用模板的区域进行遍历
        for y in range(v_w,self.f_height-v_w):
            for x in range(v_w,self.f_width-v_w):
                v_values=self.Img[y-v_w:y+v_w+1,x-v_w:x+v_w+1] # 得到所有像素元的值
                img_buf[y][x]=handle(v,v_values) #将对于的值丢到处理接口中
        self.Img=img_buf

后面我单独实现了一个接口,可以处理黑白图去噪滤波器,如下

#去除黑白图噪声滤波处理接口
def BWhandle(v,v_values):
    res=np.array([]) #等待返回的结果
    for i in range(0,3):# 对R、G、B三种分量进行处理
        src=v_values[:,:,i] # 首先取出原始图像的数据
        x=np.sum(src*v) #然后使用对应模板进行取值
        '下面,则是去黑白噪点滤波的判断方式'
        if x>127.5:
            x=255
        else:
            x=0
        res=np.append(res,x)
    return res

代码运行的效果如下

原图
在这里插入图片描述
使用算法处理之后的图像如下
在这里插入图片描述

下面的代码实现了均值滤波

什么时候用均值滤波呢?
一副图像往往受到各种噪声的干扰,噪声常常是一些孤立的像素点,往往是叠加再图像上的随机噪声。像素的灰度应该是连续变化的,一般不会突然变大,或者突然变小。这种噪声,可以用均值滤波来储器。但是该滤波会造成图像模糊

特性如下

  • 对于单调递增或者单调递减的序列,输出值不变
  • 非线性的
  • 对高斯噪声的处理效果不太好。
  • 大边缘,中值滤波好于均值滤波
#均值滤波处理接口
def avgHandle(v,v_values):
    res=np.array([]) #等待返回的结果
    for i in range(0,3):# 对R、G、B三种分量进行处理
        src=v_values[:,:,i] # 首先取出原始图像的数据
        x=np.sum(src*v) #然后使用对应模板进行取值
        if x>255:
            x=255
        elif x<0:
            x=255
        res=np.append(res,x)
    return res

原图如下
在这里插入图片描述
算法计算之后的图像如下
在这里插入图片描述
图像明显变模糊了,黑点颜色变浅了。

下面的代码实现了中值滤波,其原理就是将窗口中的数值从小到大排序,取中间值为最终结果。该方法对于滤除脉冲干扰以及图像扫描噪声最为有效,克服了领域平均法带来模糊的现像,该滤波既可以消除噪声,又可以保持图像的细节,可以消除孤立的噪声点。但是对于点、线、尖较多的图像不适宜使用

# 中值滤波的处理接口
def medianHandle(v, v_values):
    res=np.array([]) #等待返回的结果
    for i in range(0,3):# 对R、G、B三种分量进行处理
        src=v_values[:,:,i] # 首先取出原始图像的数据
        x=np.median(src)
        res=np.append(res,x)
    return res

下面为算法处理之后的图像,与均值滤波相比,其效果实在是好了太多了!
在这里插入图片描述

最后再提一下。滤波器不一定非要选择正方体。不同形状的滤波器,可以解决各种算法的一些缺陷。
在这里插入图片描述

  • 窗口:线状、方形、圆形、十字形及圆环等

  • 方形或圆形窗口:缓变的较长轮廓线物体为宜。

  • 十字形窗口:含有尖顶物体适用,窗口大小则以不超过中最小有效物体的尺寸为宜。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReWz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值