图像滤波处理:空间滤波器实现

来源:互联网 发布:知乎 伊斯兰教和佛教 编辑:程序博客网 时间:2024/06/09 15:42

课后作业,实现:均值、谐波均值、中值、中点等滤波器。对应《数字图像处理》第三版,5.1-5.9课后题。


代码基于Matlab实现。完整代码及处理结果见:GitHub

步骤

  1. 加载图像
  2. 向外拓展一个像素的大小
  3. 与滤波器做卷积操作
  4. 输出图像

5.1 算数均值滤波

代码实现

close allclear allimage=imread('filtering.tif');figure();subplot(2,2,1);imshow(image);xlabel('Raw image');image_mean_3 = arithmetic_mean_filter(image,3);subplot(2,2,2);imshow(image_mean_3)xlabel('arithmetic mean filter/3');image_mean_5 = arithmetic_mean_filter(image,5);subplot(2,2,3);imshow(image_mean_5)xlabel('arithmetic mean filter/5');image_mean_9 = arithmetic_mean_filter(image,9);subplot(2,2,4);imshow(image_mean_9)xlabel('arithmetic mean/9');%%function [result_imag]= arithmetic_mean_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);                 result_imag(x,y)=sum(slid(:))/numel(slid);        end    endend%%function [result_imag] = extend_imag(image)    [M,N] = size(image);    temp = zeros(M+2,N+2);    for x = 1:M        temp(x+1,:) = [image(x,1) image(x,:) image(x,N)];    end    temp(1,:) = temp(2,:);    temp(M+2,:) = temp(M+1,:);    result_imag = temp;end

其中 extend_imag 用于向外拓展像素。arithmetic_mean_filter 是核心的滤波器实现以及运算操作。

结果


5.2 几何均值滤波

这里只展示核心的滤波器实现代码。完整代码见GitHub

%%function [result_imag]= geo_mean_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);                 result_imag(x,y)=prod(slid(:))^(1/numel(slid));        end    endend

5.3 谐波均值滤波

%%function [result_imag]= harmonic_wave_mean_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            slid = 1./slid;            result_imag(x,y) = numel(slid(:))/sum(slid(:));        end    endend

5.4 逆谐波均值滤波(Q=1.5)

%%function [result_imag]= Inv_harmonic_wave_mean_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    Q=1.5;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            result_imag(x,y) = sum(slid(:).^(Q+1))/sum(slid(:).^(Q));        end    endend

5.5 逆谐波均值滤波(Q=-1.5)

%%function [result_imag]= Inv_harmonic_wave_mean_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    Q=-1.5;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            result_imag(x,y) = sum(slid(:).^(Q+1))/sum(slid(:).^(Q));        end    endend

5.6 中值滤波

%%function [result_imag]= min_value_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            temp = sort(slid(:));            result_imag(x,y)= temp((numel(temp)-1)/2);        end    endend

5.7 最大值滤波

%%function [result_imag]= max_value_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            temp = slid(:);            result_imag(x,y)= max(temp);        end    endend

5.8 最小值滤波

%%function [result_imag]= max_value_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            temp = slid(:);            result_imag(x,y)= min(temp);        end    endend

5.9 中点滤波

%%function [result_imag]= half_value_filter(image,filter_size)    Ex_image = extend_imag(image);    result_imag = image;    [M,N]=size(Ex_image);    helf_size = (filter_size-1)/2;    for x=1+helf_size:1:M-helf_size        for y=1+helf_size:1:N-helf_size            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);            temp = slid(:);            result_imag(x,y)= (max(temp)+min(temp))/2;        end    endend
原创粉丝点击