精华内容
下载资源
问答
  • 自适应中值滤波自编,matlab自编函数,自编函数自适应中值滤波
  • 文章目录1 中值滤波1.1 原理1.2 中值滤波对图像的影响1.3 函数编写1.4 主文件1.5 效果展示2 高效的中值滤波算法2.1 原理2.2 函数编写3 带权重的中值滤波3.1 原理3.2 函数编写3.3 主文件3.4 效果展示 1 中值滤波 1.1 ...

    1 中值滤波

    1.1 原理

    顾名思义,取中值的滤波方法。
    在这里插入图片描述
    如上图示,对于一个3*3大小的滤波器,每次取3*3大小范围内的中值赋值给当前像素。

    1.2 中值滤波对图像的影响

    如下图示,根据中值滤波器的定义:

    (a)单独的一个像素会被消除;(b)单独的一条线会被消除;

    (c)阶跃边界保持不变;(d)拐角会被磨圆。
    在这里插入图片描述
    因此中值滤波可以很好地去除椒盐噪声,稍后讲到。

    1.3 函数编写

    function imgMedian = medianfilter(img,filterSize)
    % img: image
    % filterSize: if=5, it means 5*5
    
    % Generate new blank image
    [h, w, c] = size(img);
    padSize = (filterSize-1)/2;
    imgMedianT = zeros([h+2*padSize, w+2*padSize, c]);
    imgMedianT(1+padSize:padSize+h, 1+padSize:padSize+w, :) = img;
    imgMedian = zeros([h, w, c]);
    
    for k = 1:c
        for i = 1:h
            for j = 1:w
                block = imgMedianT(i:i-1+filterSize, j:j-1+filterSize, k);
                imgMedian(i, j, k) = median(block, 'all');
            end
        end
    end
    
    imgMedian = uint8(imgMedian);
    
    end
    
    
    

    1.4 主文件

    % imgOrg = rgb2gray(imread("peppers.png"));
    imgOrg = imread("peppers.png");
    imgOrg = imnoise(imgOrg, 'salt & pepper'); % Adding salt-pepper noise
    subplot(1,3,1);
    imshow(imgOrg);
    title("Originall img");
    
    % median filter
    imgMedian = medianfilter(imgOrg, 3); % Generally, the size of a filter is an odd num
    subplot(1,3,2);
    imshow(imgMedian);
    title("Median filter img");
    
    % Using Matlab API
    subplot(1,3,3);
    [~, ~, c] = size(imgOrg);
    newImg = zeros(size(imgOrg));
    for i = 1:c
        newImg(:,:,i) = medfilt2(imgOrg(:,:,i));
    end
    newImg = uint8(newImg);
    imshow(newImg);
    title("Medfilt img by API");
    

    1.5 效果展示

    在这里插入图片描述
    可以看到,椒盐噪声被很好地去除了~

    2 高效的中值滤波算法

    2.1 原理

    在每个像素位置上都要对滤波器范围内的所有像素进行排序,这样非常耗时费力。优化[Huang et al., 1979; Pitas and Venetsanopoulos, 1990]后的方法为:当窗口沿行移动一列时,窗口内容的变化只是用右边的一个新列代替了左边的一列,对于m*n的滤波器,(mn-2m)个像素没有变化。

    算法步骤:
    在这里插入图片描述
    在这里插入图片描述

    2.2 函数编写

    请移步Matlab实现图像滤波(叁):高效的中值滤波查看哦~

    3 带权重的中值滤波

    3.1 原理

    滤波器的每个数字代表了对应位置像素的权重,如下图示, I ( i , j ) 位 置 重 复 W ( i , j ) 次 I(i,j)位置重复W(i,j)次 I(i,j)W(i,j)再进行排序。
    在这里插入图片描述

    3.2 函数编写

    function imgwMedianf = wMedianf(img,filter)
    % img: image
    % filterSize: if=5, it means 5*5
    
    % Generate new blank image
    [h, w, c] = size(img);
    [hf, wf] = size(filter);
    hpadSize = (hf-1)/2;
    wpadSize = (wf-1)/2;
    imgMedianT = zeros([h+2*hpadSize, w+2*wpadSize, c]);
    imgMedianT(1+hpadSize:hpadSize+h, 1+wpadSize:wpadSize+w, :) = img;
    imgwMedianf = zeros([h, w, c]);
    filter = filter(:);
    
    for k = 1:c
        for i = 1:h
            for j = 1:w
                block = imgMedianT(i:i-1+hf, j:j-1+wf, k);
                block = block(:);
                block = repelem(block, filter);
                imgwMedianf(i, j, k) = median(block, 'all');
            end
        end
    end
    
    imgwMedianf = uint8(imgwMedianf);
    
    end
    
    

    3.3 主文件

    % imgOrg = rgb2gray(imread("peppers.png"));
    imgOrg = imread("peppers.png");
    imgOrg = imnoise(imgOrg, 'salt & pepper'); % Adding salt-pepper noise
    subplot(1,2,1);
    imshow(imgOrg);
    title("Originall img");
    
    % Weighted Median filter
    filter = [1, 2, 1;
              2, 3, 2;
              1, 2, 1];
    imgwMedianf = wMedianf(imgOrg, filter); % Generally, the size of a filter is an odd num
    subplot(1,2,2);
    imshow(imgwMedianf);
    title("Weighted Median filter img");
    
    

    3.4 效果展示

    在这里插入图片描述

    展开全文
  • B = HMF(A,N) 使用 NxN 框矩阵 A 执行混合中值滤波。 混合中值过滤比基于 NxN 平方核的中值过滤器更好地保留边缘,因为来自不同空间方向的数据是分开排列的。 在 NxN 框中计算三个中值:MR 是水平和垂直 R 像素的...
  • 本文为博主原创文章,转载请标明链接。...目录 1 图像增强——图像平滑 ...3 中值滤波 4 高斯滤波 参考资料 1 图像增强——图像平滑 1.1 图像增强简介 图像增强是图像进行处理,使其比原始图像更适合于特定的应用,它...

    本文为博主原创文章,转载请标明链接。 https://blog.csdn.net/zaishuiyifangxym/article/details/89788020

    目录

    1 图像增强——图像平滑

    1.1 图像增强简介

    1.2 图像平滑

    2 均值滤波

    3 中值滤波

    4 高斯滤波

    参考资料

    1 图像增强——图像平滑
    1.1 图像增强简介
    图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强主要是一个主观过程,而图像复原大部分是一个客观过程。图像增强的方法是因应用不同而不同的,研究内容包括:

    1.2 图像平滑
    图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。

    图像平滑 有均值滤波、方框滤波、中值滤波和高斯滤波等。下面将介绍常用的均值滤波、中值滤波和高斯滤波。

    为了实验方便,首先给图像加一点噪声。

    代码如下所示:

    -- coding:utf-8 --

    import cv2
    import numpy as np

    读取图片

    img = cv2.imread(“zxp.jpg”, cv2.IMREAD_UNCHANGED)
    img_noise=img

    cv2.imshow(“src”, img)

    rows, cols, chn = img_noise.shape

    加噪声

    for i in range(5000):
    x = np.random.randint(0, rows)
    y = np.random.randint(0, cols)
    img_noise[x, y, :] = 255

    cv2.imshow(“noise”, img_noise)

    等待显示

    cv2.waitKey(0)
    cv2.destroyAllWindows()

    #保存含噪声图像
    cv2.imwrite(“zxp_noise.jpg”, img_noise)

    运行结果如下图所示:

    2 均值滤波
    均值滤波是指任意一点的像素值,都是周围 个像素值的均值。例如下图中,红色点的像素值是其周围蓝色背景区域像素值之和除25,25=55 是蓝色区域的大小。

    均值滤波详细的计算方法如下图所示:

    其中55的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:

    提取 1/25 可以将核转换为如下形式:

    Python调用OpenCV实现 均值滤波 的函数如下:

    result = cv2.blur(原始图像,核大小)
    其中,核大小是以(宽度,高度)表示的元组形式。常见的形式包括:核大小(3,3)和(5,5)。

    (1) 核大小为 33

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)
    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    https://blog.csdn.net/zxc131405/article/details/95739836
    https://blog.csdn.net/zxc131405/article/details/95739686
    https://blog.csdn.net/zxc131405/article/details/95739648

    均值滤波

    result = cv2.blur(source, (3, 3)) #可以更改核的大小

    显示图形

    titles = [‘Source Image’, ‘Blur Image (3, 3)’]
    images = [source, result]
    for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], ‘gray’)
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
    plt.show()

    运行结果如下图所示:

    (2) 核大小为 55

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)
    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    均值滤波

    result = cv2.blur(source, (5, 5)) #可以更改核的大小

    显示图形

    titles = [‘Source Image’, ‘Blur Image (5, 5)’]
    images = [source, result]
    for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], ‘gray’)
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
    plt.show()

    运行结果如下图所示:

    (2) 核大小为 1010

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)
    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    均值滤波

    result = cv2.blur(source, (10, 10)) #可以更改核的大小

    显示图形

    titles = [‘Source Image’, ‘Blur Image (10, 10)’]
    images = [source, result]
    for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], ‘gray’)
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
    plt.show()

    运行结果如下图所示:

    注:

    1)随着核大小逐渐变大,会让图像变得更加模糊;

    2)如果设置为核大小为(1,1),则结果就是原始图像。

    3 中值滤波
    在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。计算过程如下图所示:

    http://www.dianyuan.com/people/793898
    http://www.dianyuan.com/people/793899
    http://www.dianyuan.com/people/793900
    http://www.dianyuan.com/people/793901
    http://www.dianyuan.com/people/793902
    http://www.dianyuan.com/people/793903
    http://www.dianyuan.com/people/793904
    http://www.dianyuan.com/people/793905
    http://www.dianyuan.com/people/793906
    http://www.dianyuan.com/people/793907
    http://www.dianyuan.com/people/793908
    http://www.dianyuan.com/people/793909
    http://www.dianyuan.com/people/793910
    http://www.dianyuan.com/people/793911
    http://www.dianyuan.com/people/793912
    http://www.dianyuan.com/people/793913
    http://www.dianyuan.com/people/793914
    http://www.dianyuan.com/people/793915
    http://www.dianyuan.com/people/793916
    http://www.dianyuan.com/people/793917
    http://www.dianyuan.com/people/793918

    Python调用OpenCV实现 中值滤波 的函数如下:

    OpenCV主要调用 medianBlur() 函数实现中值滤波。图像平滑里中值滤波的效果最好。

    dst = cv2.medianBlur(src, ksize)

    其中,参数:

    src 表示源图像;

    ksize 表示核大小。核必须是大于1的奇数,如3、5、7等。

    (1)核大小为 33

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)

    中值滤波

    result = cv2.medianBlur(img, 3)#可以更改核的大小

    显示图像

    cv2.imshow(“source img”, img)
    cv2.imshow(“medianBlur”, result)

    等待显示

    cv2.waitKey(0)
    cv2.destroyAllWindows()

    运行结果如下图所示:

    (2)核大小为 55

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)

    中值滤波

    result = cv2.medianBlur(img, 5) #可以更改核的大小

    显示图像

    cv2.imshow(“source img”, img)
    cv2.imshow(“medianBlur”, result)

    等待显示

    cv2.waitKey(0)
    cv2.destroyAllWindows()

    运行结果如下图所示:

    (3)核大小为 77

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)

    中值滤波

    result = cv2.medianBlur(img, 7) #可以更改核的大小

    显示图像

    cv2.imshow(“source img”, img)
    cv2.imshow(“medianBlur”, result)

    等待显示

    cv2.waitKey(0)
    cv2.destroyAllWindows()

    运行结果如下图所示:

    注:

    1)随着核大小逐渐变大,会让图像变得更加模糊;

    2)核必须是大于1的奇数,如3、5、7等;

    3)在代码 dst = cv2.medianBlur(src, ksize) 中 填写核大小时,只需填写一个数即可,如3、5、7等,对比均值滤波函数用法。

    4 高斯滤波
    为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。

    图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 33 和 55 邻域的高斯模板。

    (1)核大小为 33

    (1)核大小为 55

    高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

    Python中OpenCV主要调用 GaussianBlur() 函数,如下:

    dst = cv2.GaussianBlur(src, ksize, sigmaX)

    其中,参数:

    src 表示原始图像;

    ksize 表示核大小;

    sigmaX 表示X方向方差。

    注:核大小(N, N)必须是奇数,X方向方差主要控制权重。

    1)核大小为 33

    2)核大小为 55

    (1)核大小为 33

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)
    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    高斯滤波

    result = cv2.GaussianBlur(source, (3, 3), 0) #可以更改核大小

    显示图形

    titles = [‘Source Image’, ‘GaussianBlur Image (3, 3)’]
    images = [source, result]
    for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], ‘gray’)
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
    plt.show()

    运行结果如下图所示:

    (2)核大小为 55

    代码如下所示:

    encoding:utf-8

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt

    读取图片

    img = cv2.imread(‘zxp_noise.jpg’)
    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    高斯滤波

    result = cv2.GaussianBlur(source, (5, 5), 0) #可以更改核大小

    显示图形

    titles = [‘Source Image’, ‘GaussianBlur Image (5, 5)’]
    images = [source, result]
    for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], ‘gray’)
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
    plt.show()

    运行结果如下图所示:

    注:

    1)随着核大小逐渐变大,会让图像变得更加模糊;

    2)核大小(N, N)必须是大于1的奇数,如3、5、7等

    作者:在水一方xym
    来源:CSDN
    原文:https://blog.csdn.net/zaishuiyifangxym/article/details/89788020
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 1、中值滤波2113的原理:对于一串连续输入的信号5261(量化后是一组数据)4102。如下图所示,1653是输入的原信号。中值滤波的原理为,重新计算每一个x的输出值(y),新的输出值。相当于y=new(x),new的操作是,从在以x...

    1、中值滤波2113的原理:对于一串连续输入的信号5261(量化后是一组数据)4102。如下图所示,1653是输入的原信号。中值滤波的原理为,重新计算每一个x的输出值(y),新的输出值。相当于y=new(x),new的操作是,从在以x为中心,长度为2k的原信号中(区间为[x-k+1,x+k]),提取出这段区间内中间的那个值,作为y=new(x)的结果。2、举例来说,输入:Y[1-10]:1,2,3,4,5,6,7,8,9,10.取区间2k=4,所以k=2;执行中值滤波K=中值滤波(Y)、由x-k+1>=1,所以当k=2时,x>=2、滤波时:K[1]=Y[1]K[2]=(Y[1]、Y[2]、Y[3]、Y[4])的中间值,即为2或3。3、matlab的中值滤波实现方式:调用函数:A=medfilt1(B,n)、B为输入信号,A为滤波后的信号,即结果。4、对于输入信号(最开头的图),以下分别为设置区间n=8和n=16得到的滤波图像。中值滤波可以过滤尖峰脉冲。目的在于我们对于滤波后的数据更感兴趣。滤波后的数据保留的原图像的变化趋势,同时去除了尖峰脉冲对分析造成的影响,原发布者:一团糟钨灾中值滤波原理2113及MATLAB实现摘要:5261图像是一种重要的信息源,通过图像处4102理可以帮助人们了解信息的内1653涵。本文将纯净的图像加入椒盐噪声,然后采用中值滤波的方法对其进行去噪。中值滤波是一种常用的非线性信号处理技术,在图像处理中,它对滤除脉冲干扰噪声最为有效。文章阐述了中值滤波的原理、算法以及在图像处理中的应用。MATLAB是一种高效的工程计算语言,在数据处理、图像处理、神经网络、小波分析等方面都有广泛的应用。关键词:图像,中值滤波,去噪,MATLAB1.引言20世纪20年代,图像处理首次得到应用。上个世纪60年代中期,随着计算机科学的发展和计算机的普及,图像处理得到广泛的应用。60年代末期,图像处理技术不断完善,逐渐成为一个新兴的学科。图像处理中输入的是质量低的图像,输出的是改善质量后的图像。为了改善图像质量,从图像中提取有效信息,必须对图像进行去噪预处理。根据噪声频谱分布的规律和统计特征以及图像的特点,出现了多种多样的去噪方法。经典的去噪方法有:空域合成法,频域合成法和最优合成法等,与之适应的出现了许多应用方法,如均值滤波器,中值滤波器,低通滤波器,维纳滤波器,最小失真法等。这些方法的广泛应用,促进数字信号处理的极大发展,显著提高了图像质量。2.中值滤波在图像滤波中,常用的方法是线性滤波技术和非线性滤波技术,线性滤波以其完美的理论基础,数学处理简单、易于采用和硬件实现等优点,一直在图像滤波领域中占有重要的地位。线性,中值滤2113波medfilt2,用法B = medfilt2(A, [m n])你的5261两点错误一、4102输入图像A,应该是二维1653矩阵你用输入图像b是由imread得到的a加上噪声得到的而imread读到的图像a通常是3维rgb图,是三维矩阵直接用medfilt2是不对的,可以先用rgb2gray(a)将a先转换为灰度矩阵二、中值滤波也要指定滤波模版的大小medfilt2需要两个输入参数,第一个是图像A第二个参数需要输入一个长度是二的向量,[m n]指定模版的大小,m行n列本回答被提问者和网友采纳,补充下:二、中2113值滤波medfilt2并不一定需5261要指定4102[m n],不指定的话默认为[3 3]。参见:1653B = medfilt2(A) performsmedian filtering of the matrix A using the default3-by-3 neighborhoodwww.mh456.com防采集。

    %%中值I=imread('lena.bmp'); %读原图J1=imnoise(I,'salt & pepper',0.02); %加均2113值为0,方5261差为0.02的椒4102盐噪声J2=imnoise(I,'gaussian',0.02); %加均值为0,方差为0.02的高斯噪声。subplot(2,2,1),imshow(J1); %显示1653有椒盐噪声图像subplot(2,2,2),imshow(J2); %显示有高斯噪声图像I1= medfilt2(J1,[5,5]); %对有椒盐噪声图像进行5×5方形窗口中值滤波I2= medfilt2(J2,[5,5]); %对有高斯噪声图像进行5×5方形窗口中值滤波subplot(2,2,3),imshow(I1); %显示有椒盐噪声图像的滤波结果subplot(2,2,4),imshow(I2); %显示有高斯噪声图像的滤波结果 %%均衡I=imread('lena.bmp'); %将图读入到Iimshow(I); %显示图像figure,imhist(I); %直方图I2=histeq(I); %均衡化figure;imshow(I2); %处理后图像显示figure;imhist(I2); %均衡化后直方图imwrite(I2,'lena2.bmp'); %保存图像

    均值滤波器是一种最常用的线性低通平滑滤波器,可抑制图像中的加性噪声,但同时也使图像变得模糊;中值滤波器是一种最常用的非线性平滑滤波器,可消除图像中孤立的噪声点,又可产生较少的模糊。

    78310a55b319ebc468e8558f8526cffc1e171617.jpg

    内容来自www.mh456.com请勿采集。

    展开全文
  • 文章目录中值滤波介绍opencv自带的中值滤波函数简单算法实现中值滤波快速算法实现中值滤波 中值滤波介绍 中值滤波介绍 中值滤波定义:将????(????为奇数)个数据按其值????????进行从大到小或者从小到大排列后得到一...


    中值滤波介绍

    中值滤波介绍
    中值滤波定义:将𝑛(𝑛为奇数)个数据按其值𝑑𝑖进行从大到小或者从小到大排列后得到一个有序序列:𝑑0,𝑑1, … ,𝑑𝑛−1,则𝑑(𝑛/2)称为中值。例如:有序序列10,11,12,13,14,15,16,17,18的𝑛 = 9,有 [9/2] = 4,则中值为𝑑4,即14。
      根据以上可知,中值滤波就是以当前像素为中心取一个邻域,用该区域的所有像素灰度值的中值作为该像素滤波后的灰度值。
    中值滤波作用
      中值滤波的作用很大程度上是基于均值滤波来讲的,我们知道均值滤波是以某一像素为中心,将其对应的某一领域中所有像素值的均值作为这一中心的滤波后的值,均值滤波总会导致图像的模糊,而采用中值滤波可以很好的解决这个问题,尤其是在面对椒盐噪声这种像素点噪声时,中值滤波总是会有非常好的效果。

    opencv自带的中值滤波函数

      
    中值滤波函数

    medianBlur(OriImage1, ResImage, size); OriImage为原始图像,ResImage为滤波后的图像,size为滤波器的大小
    
    /*
    *  实现中值滤波(算法来源:A Fast Two-Dimensional Median Filtering Algorithm)
    *  环境:opencv4.4   debug  x64
    *  博客链接:
    *  仅供学习
    */
    
    #include <iostream>
    #include "opencv2/core/core.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <opencv2\imgproc\types_c.h>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    	Mat image1 = imread("salt_pepper_Image.jpg");
    	if (image1.empty())
    	{
    		cout << "读取图片失败。" << endl;
    	}
    	imshow("Origin Image", image1);
    
    	//中值滤波 
    	Mat result;
    	medianBlur(image1, result, 3);
    	imshow("Result Image(after median fluter)", result);
    	waitKey(0);
    	return 0;
    }
    
    

    结果如下:
    在这里插入图片描述
    在这里插入图片描述

    简单算法实现中值滤波

      下面我们来详细叙述一下中值滤波的实现算法,首先是简单中值滤波,采用一般思维,排序取中值;
    伪代码:

     Input: image X of size m*n, kernel radius r.         图X,像素大小为m*n ,中值滤波器的半径r
          output: image Y as X.                       输出图Y
          for i = r to m - r do                       边界范围为r——(m-r)
            for j = r to n - r do                   边界为r——n-r   
              initialize list A[]                 初始化表A
              for a = i-r to i+r
                for b = j-r to j+r
                  add X(a, b) to  A[]          将滤波器对应位置的像素值放入表A中     
                end 
              end
              sort A[] then Y(i ,j) = A[A.size/2]  排序取中值
            end
          end
    

      实现的话应该很简单,有兴趣的可以根据上述伪代码取尝试实现,重要的是下面将要叙述的快速算法实现中值滤波。

    快速算法实现中值滤波

      算法思想来源于A Fast Two-Dimensional Median Filtering Algorithm这篇论文,有兴趣的同学可以去看看,当然我不是很推荐,几十年前写的论文,算法流程写的一点都不简洁,看的老费劲了。找了半天终于找到中文版的介绍,下面图片摘自https://blog.51cto.com/qianqing13579/1590217这篇博客,但是于我而言习惯于用opencv的数据格式(哈哈通俗点说,离开opencv图片都读不了),大佬的代码没法直接用,当然也有脱裤子放屁的嫌疑,你看你又离不开opencv又不他内置的函数,没办法谁叫老师就喜欢这种重复造轮子的作业呢。[无奈~~]

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    /*
    *  实现中值滤波(算法来源:A Fast Two-Dimensional Median Filtering Algorithm)
    *  环境:opencv4.4   debug  x64
    *  博客链接:
    *  仅供学习
    */
    
    
    #include <iostream>
    #include "opencv2/core/core.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <opencv2\imgproc\types_c.h>
    
    
    using namespace std;
    using namespace cv;
    
    void QuickMedianFluter(Mat OriImage, Mat& ResImage, int size);
    int FindMedian(int H[], int n,int size,int &mNum);
    
    
    
    int main()
    {
    	Mat image1 = imread("salt_pepper_Image.jpg", IMREAD_GRAYSCALE);
    	if (image1.empty())
    	{
    		cout << "读取图片失败。" << endl;
    	}
    	imshow("Origin Image", image1);
    
    
    
    	//中值滤波,调用opencv自带的函数 
    	Mat result1;
    	medianBlur(image1, result1, 3);
    	imshow("Result1 Image(after median fluter,opencv自带)", result1);
    
    	//快速中值滤波,利用自己编写的函数
    	Mat result2;
    	result2 = image1.clone();
    	//ResImage = OriImage.clone();
    	QuickMedianFluter(image1, result2, 3);
    	imshow("Result2 Image(自我编写函数)", result2);
    
    
    	waitKey(0);
    	return 0;
    }
    
    
    
    /***********************************************************
    * 函数功能:中值滤波(利用直方图法快速实现)
    * 参数介绍:OriInage:原图    ResImage:滤波后的图
    *			size:滤波器(或者领域)边长,大小为size x size(如3x3) 
    ***********************************************************/
    
    
    
    void QuickMedianFluter(Mat OriImage, Mat& ResImage, int size)
    {
    	int m = OriImage.rows;   //m是行,对应下面的x
    	int n = OriImage.cols;   //n是列,对应下面的n
    	int *Histogram = new int[256];
    	memset(Histogram, 0, 256 * sizeof(int));
    	int radius = size / 2;    //半径
    	int th = size * size / 2 + 1;    //算法中的th
    	int median = 0;     //保存直方图中的中值对应的像素
    	int mNum = 0;       //保存小于中值像素median的总个数
    	int left = 0;       //最左列将要移除的
    	int right = 0;      //最右边将要加入的
    
    
    	if (OriImage.channels() != 1)
    	{
    		cout << "图片不是灰度图像,请转化为灰度图像后再尝试。" << endl;
    	}
    
    	//处理边界,边界没法进行中值滤波,因此将边界所有像素赋值给ResImage
    	//直接clone过去即可,中间部分会随着滤波过程的进行随之改变
    	
    	
    	for (int i = radius; i < m - radius; i++)  //m是行,对应x从上至下
    	{
    		//初始化Histogram
    		memset(Histogram, 0, 256 * sizeof(int));
    		for (int k = i-radius; k <= i+radius; k++)
    		{
    			for (int h = 0; h < size; h++)
    			{
    				Histogram[OriImage.at<uchar>(k, h)]++;
    			}
    		}
    		median= FindMedian(Histogram, 256, size,mNum);
    		ResImage.at<uchar>(i,radius) = median;
    
    
    		for (int j = radius; j < n - radius; j++)   //n是列,对应y从左至右
    		{
    			//j在radius处,直方图已求,跳过
    			if (j == radius) continue;   
    			//根据算法,中心向右移动一位,将最左列的数移除直方图中
    			for (int k = i-radius; k <= i + radius; k++)
    			{
    				left = OriImage.at<uchar>(k, j - 1 - radius);
    				Histogram[left]--;
    				if (left <= median) mNum = mNum - 1;
    			}
    			
    			//根据算法,中心向右移动一位,将最右侧的数移入直方图中
    			for (int k = i-radius; k <= i + radius; k++)
    			{
    				right = OriImage.at<uchar>(k, j + radius);
    				Histogram[right]++;
    				if (right <= median) mNum = mNum + 1;
    			}
    
    			if (mNum == th)
    			{
    				ResImage.at<uchar>(i, j) = median;
    				continue;
    
    			}
    			//利用前一中值和所有小于等于中值median的数mNum,求当前中值
    			if (mNum < th)
    			{
    				//小于th(第th个数为中值),在当前median右边,往右找(像素加一寻找)
    				while (mNum < th) {
    					median = median + 1;
    					mNum = mNum + Histogram[median];
    				}
    			}
    			else {
    				//大于th(第th个数为中值),在当前median左边,往右找(像素减一寻找)
    				while (mNum > th)
    				{
    					mNum = mNum - Histogram[median];
    					median = median - 1;
    				}
    			}
    			ResImage.at<uchar>(i, j) = median;
    			
    		}
    	}
    
    	delete[] Histogram;
    }
    
    /**************************************************************
    * 函数功能:通过直方图返回中值
    * 参数介绍:H[]:直方图数组  n:直方图维数
    *			size:滤波器的大小
    ****************************************************************/
    
    
    
    int FindMedian(int H[], int n,int size,int &mNum)
    {
    	int median = 0;   //初始化中值为0
    	int sum_cout = 0;  //求和
    	int median_flag = size * size / 2;  //中值标志
    	for (int i = 0; i < 256; i++)
    	{
    		sum_cout += H[i];
    		if (sum_cout > median_flag)
    		{
    			median = i;
    			break;
    		}
    	}
    	mNum = sum_cout;
    	return median;
    }
    
    
    

    结果:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    另外提一句,使用imread()函数读取图片时,最好加上IMREAD_GREYSCALE(表示读取为灰度图片)等类似限定图片类型的限定参数,不然可能会出现很多意想不到的意外,我就是因为这个问题,改了两天的bug。。。泪目。。。

    稍微说下吧,当我用

    Mat image1 = imread("salt_pepper_Image.jpg");
    

    直接读取时,最终结果是这样:
    在这里插入图片描述
    很奇怪吧,只有左边一部分进行了 中值滤波,我查过总共是 150列(利用image.cols),但是实际上远不是150列。

    当我加上IMREAD_GREYSCALE时,即:

    Mat image1 = imread("salt_pepper_Image.jpg",IMREAD_GREYSCALE);
    

    后,输出的图片是这样的:
    在这里插入图片描述
    所以,不能 偷懒,该写上的 东西就别忘!!!

    展开全文
  • 开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降,...首先介绍了中值滤波的原理, 给出其实现思路,并根据思路实现了 C+...
  • 原图 + 自己手写的中值滤波 + OpenCV的中值滤波. 肉眼参看非常的接近.但效率上仍然无法与OpenCV匹敌.一个天上一个地下.以学习的目的进行手写. 原理比较简单,消除椒盐噪点效果是非常的好.上面的图就是一个充满了...
  • 中值滤波3*3滤波窗口程序如下:>> i=imread('Winter.jpg'); %读入图像subplot(2,2,1);imshow(i); %显示原始图像title('original'); %设置图像标题j = imnoise(i,'salt & pepper',0.02); %加均值为0,方差...
  • 今天给大侠简单带来FPGA verilog HDL实现中值滤波,话不多说,上货。一、实现步骤:1、查看了中值滤波实现相关的网站和paper;2、按照某篇paper的设计思想进行编程实现;3、各个模块进行语法检查、波形仿真、时序设...
  • 中值滤波是数字信号处理、数字图像处理中常用的预处理技术,特点是将信号中每个值都替换为其邻域内的中值,即邻域内所有值排序后中间位置上的值。下面的代码演示了scipy库中signal模块的中值滤波算法的用法。>>> ...
  • MATLAB常用的滤波函数比较:均值滤波和中值滤波 均值滤波中值滤波运行结果程序代码 均值滤波 均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。是典型的线性滤波算法,它是指在图像上目标像素给一个模板,...
  • 图像空间滤波常用的函数:模板卷积处理函数中值滤波函数/************************************************************************* * /函数名称: * Template() * /输入参数: * LPSTR lpDIBBits - 指向...
  • 开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降,...首先介绍了中值滤波的原理, 给出其实现思路,并根据思路实现了 C+...
  • cv2.getTickCount()函数返回从参考点到这个函数被执行的时钟数。所以当你在一个函数执行... img1 = cv2.medianBlur(img1,i)中值滤波,第一个参数是待处理图像,第二个参数是孔径的尺寸,一个大于1的奇数。比如这里
  • value = im.getpixel((w,h)) row.append(value) data.append(row) # 二维中值滤波 data = np.float32(data) # 滤波窗口的大小会结果产生很大影响 data = signal.medfilt2d(data, (3,3)) # 创建并保存结果图像 for...
  • 一维中值滤波函数,调用函数,输入滤波窗口值和初始一维滤波向量,输出滤波后的向量
  • 用自编函数进行均值滤波、中值滤波、高斯滤波,并与matlab自带函数进行比较
  • 中值滤波demo2.2. 双边滤波demo结构体参考 一. 线性滤波 1.1. 方框滤波 方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。 通用的滤波kernel如下: 这里是一个长宽...
  • 本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!...中值滤波就是用滤波器范围内所有像素值的中值来替代滤波器中心位置像素值的...
  • opencv中值滤波函数

    2015-09-13 19:21:52
    中值滤波是利用3*3矩阵,利用中值取代本像素值的一种滤波算法
  • 实现了数字图像处理中的中值滤波,包含线、十字、X,方形、棱形、圆形窗口的滤波窗口。全都是自己写的,有注释。适用于交作业和研究学习中值滤波的朋友
  • 矢量中值滤波对彩色图像进行去噪

    千次阅读 2020-03-16 15:45:39
    矢量中值滤波对彩色图像进行去噪 一、对彩色图像进行中值滤波去噪的特点 之前我们其实说过对灰度图像进行中值滤波去噪的操作,但是对彩色图像利用中值滤波去噪的情况又有所不同,其主要原因是灰度图像的rgb分量均...
  • 自适应中值滤波MATLAB

    2018-09-07 09:42:00
    自适应中值滤波函数
  • 快速中值滤波及c语言实现 学生姓名:刘勇学号: 6100410218 专业班级:数媒101 【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题....
  • matlab中的中值滤波medfilt2()和opencv中的中值滤波medianblur()做出的结果不同,如图所示: Opencv处理结果如下: Matlab处理结果如下: Opencv处理过程中的程序代码: float aa[] = { 1, 2, 3, 4, 5, 6, 7, ...
  • 17、中值滤波

    2021-03-16 17:37:10
    二、medianBlur()函数实现中值滤波 2.1、函数调用形式 dst = cv2.medianBlur(src,ksize) src:需要处理的图像 ksize:核大小,是一个比 1 大的奇数,不是元组 2.2、案例实现 #Author:MuMengSunny #Filename:中值...
  • Python语言不调用OpenCV函数实现均值滤波编译环境前提运行结果目的 编译环境 由于编程语言选择Python,所以博主用的编译器为PyCharm 2017 前提 我们在学了冈萨雷斯的数字图像处理之后,了解到里面许多的滤波函数...
  • 使用 view_as_blocks (来源于skimage.util)函数。当我们想要非重叠图像块执行局部操作时,块视图(view_as_blocks的返回值)非常有用。我们将 图像 astronaut (来源于skimage.data)切成小方块(4*4)。在每个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,541
精华内容 3,816
关键字:

对函数进行中值滤波