• 图像处理-中值滤波


    1、滤波

    滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。在图像处理中,滤波是图像预处理的一种。图像处理中滤波将信号中特定的波段频率滤除,从而保留所需要的波段频率信号。

    2、滤波的作用

    (1)消除图像中混入的噪声
    对应的是低通滤波,噪声在图像中一般是高频信号。
    (2)为图像识别抽取出图像特征
    这里的特征一般为边缘纹理的特征,对应的是高通滤波,图像中边缘和纹理细节是高频信号。

    3、滤波的分类

    图像中滤波算法的分类有很多,可以分为线性滤波和非线性滤波,可以分为相关滤波和卷积滤波,还可以分为高通滤波和低通滤波,空间滤波和频域滤波。

    3.1线性滤波

    用于时变输入信号的线性运算,在图像处理中可以这么理解,对于输入的信号(即要处理的图像),进行的是线性的运算,得出的结果作为输出图像。

    线性滤波的包含方框滤波、均值滤波、高斯滤波、拉普拉斯滤波、sobel算子等。

    3.2非线性滤波

    输出的信号响应是由输入经过非线性的运算得到的。比如典型的中值滤波,就是取像素点邻域的中值作为像素的的响应输出。

    非线性滤波包含中值滤波和双边滤波

    4、中值滤波

    中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3x3,5x5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
    原理图解释:

             
      4 5 6  
      8 2 7  
      5 6 9  
             

    g(x,y)=med{f(x-k,y-l),(k,l∈W)}

    g =med[4,5,6;8,2,7;5,6,9] = 6

    2、4、5、5、6、6、7、8、9中间的值为6

             
             
        6    
             
             

     MATLAB程序

    clc
    clear
    clear all 
    close all
    %%%对图像做中值滤波处理
    img = imread('1.png');
    figure(1)
    subplot(2,2,1),imshow(img),title('原始图像')
    %%%将彩色图像转灰度图像
    img_gray = rgb2gray(img);
    subplot(2,2,2),imshow(img_gray),title('RGB-GRAY灰度图像')
    %%%加入椒盐噪声
    img_salt=imnoise(img_gray,'salt & pepper',0.3);
    subplot(2,2,3),imshow(img_salt),title('加入椒盐噪声后')
    %%%系统自带的中值滤波  系统自带的中值滤波输入参数为2维图像
    img_mid=medfilt2(img_salt,[3 3]);
    subplot(2,2,4),imshow(img_mid),title('对噪声图像中值滤波后');
    
    %%%对彩色图像滤波
    figure(2)
    subplot(2,2,1),imshow(img),title('原始图像')
    img_salt=imnoise(img,'salt & pepper',0.3);
    subplot(2,2,2),imshow(img_salt),title('加入椒盐噪声后')
    img_rgb = img;
    img_rgb(:,:,1) = medfilt2(img(:,:,1),[3 3]);
    img_rgb(:,:,2) = medfilt2(img(:,:,2),[3 3]);
    img_rgb(:,:,3) = medfilt2(img(:,:,3),[3 3]);
    subplot(2,2,3),imshow(img_rgb),title('加入中值滤波后')

    自定义的函数

    function [ img ] = median_filter( image, m )
    %----------------------------------------------
    %中值滤波
    %输入:
    %image:原图
    %m:模板的大小3*3的模板,m=3
     
    %输出:
    %img:中值滤波处理后的图像
    %----------------------------------------------
        n = m;
        [ height, width ] = size(image);
        x1 = double(image);
        x2 = x1;
        for i = 1: height-n+1
            for j = 1:width-n+1
                mb = x1( i:(i+n-1),  j:(j+n-1) );%获取图像中n*n的矩阵
                mb = mb(:);%将mb变成向量化,变成一个列向量
                mm = median(mb);%取中间值
                x2( i+(n-1)/2,  j+(n-1)/2 ) = mm;
     
            end
        end
     
        img = uint8(x2);
    end
    img_mid_salt = median_filter( img, 3 );
    subplot(2,2,4),imshow(img_mid_salt),title('自定义中值滤波后')

    还有一种计算中值的方法,适合在硬件上实现

    当我们使用3x3窗口后获取领域中的9个像素,就需要对9个像素值进行排序,为了提高排序效率,排序算法思想如图所示。

    (1)对窗内的每行像素按降序排序,得到最大值、中间值和最小值。

    (2)把三行的最小值即第三列相比较,取其中的最大值。

    (3)把三行的最大值即第一列相比较,取其中的最小值。

    (4)把三行的中间值即第二列相比较,再取一次中间值。

    (5)把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。 

     sort排序函数

    sort(A)若A可以使矩阵或行列向量,默认都是对A进行升序排列。

    sort(A)是默认的升序,而sort(A,'descend')是降序排序。
    sort(A)若A是矩阵,默认对A的各列进行升序排列
    sort(A,dim)
    dim=1时相当于sort(A)

    dim=2时表示对矩阵A中的各行元素升序排列

    sort(A, dim, 'descend’)则对矩阵的每行进行降序排列

    代码

    %%%方法二
    %%默认对灰度图像处理
    img_salt=imnoise(img_gray,'salt & pepper',0.03);
    Median_Img = img_salt;
    [ROW,COL]= size(img_salt);
    
    for r = 2:ROW-1
        for c = 2:COL-1
           median3x3 =[img_salt(r-1,c-1)  ,img_salt(r-1,c) ,img_salt(r-1,c+1);
                        img_salt(r,c-1)   ,img_salt(r,c)   ,img_salt(r,c+1);
                        img_salt(r+1,c-1) ,img_salt(r+1,c) ,img_salt(r+1,c+1)];
           sort1 = sort(median3x3,2,'descend');%%%行排序(降序)
           sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');%%%列排序(升序)取最小
           sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');%%%列排序(升序)取中间
           sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');%%%列排序(升序)取最大
           mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');%%%列排序(升序)
           Median_Img(r,c) = mid_num(2);%%取中间
        end
    end
    figure(3)
    imshow(Median_Img),title('方法二中值滤波后')

  • 相关阅读:
    堆排序
    快速排序
    hpp头文件与h头文件的区别
    c++_ url
    C++11:POD数据类型
    Android 触摸手势基础 官方文档概览2
    札记:android手势识别,MotionEvent
    强迫自己学习(心态篇),国庆,你准备去哪疯?
    深入理解计算机系统(2.5)---二进制整数的加、减法运算(重要)
    深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断
  • 原文地址:https://www.cnblogs.com/wanglinwensi/p/12825976.html
Copyright © 2020-2023  润新知