[Matlab]实现对图像的均值滤波

[Matlab]实现对图像的均值滤波

软件环境 matlab R2017a

搜了不少关于使用滤波器的文章,都是直接调用现有函数,我在这里简单实现了均值滤波器


问题背景:实现复杂明暗条件下的图像二值化

例如要把这张图片二值化,用于后续识别 使用全局的阈值划分,可能会得到以下结果 一个更极端的例子
[Matlab]实现对图像的均值滤波_第1张图片 [Matlab]实现对图像的均值滤波_第2张图片 [Matlab]实现对图像的均值滤波_第3张图片

显然,我们希望得到如下结果
[Matlab]实现对图像的均值滤波_第4张图片
要得出这样的结果就需要对暗处进行补偿、降低过曝处亮度,因此有了滤波器的方案


理论基础

均值滤波器相关理论

  1. 基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点的均值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点
  2. 方法是用某种结构的二维滑动窗口,将板内像素均值设为中心点的值

方案实施

  1. 举一个使用3*3的正方形窗口的例子,中心点取整个窗口中所有点的均值,实际常用图片宽度的1/16作为窗口半径

关于边界点的均值,提供3种处理方法供参考

  • 可以将矩阵向外扩充一圈,其值可以由某种算法产生(例如全填0或者是通过当前边界已有的值计算出)
  • 可以只计算窗口内有值的像素
  • 不改变(如下图)
    [Matlab]实现对图像的均值滤波_第5张图片
  1. 对第一张灰度图片全部做如此运算后可以得到一个带有各区域明暗信息的图片
    [Matlab]实现对图像的均值滤波_第6张图片

  2. 如果我们对它取反,这个图片就成为了一个亮度补偿数据,与原图片相加,可以得到[Matlab]实现对图像的均值滤波_第7张图片
    至此,我们的目的基本达到了,后续只需做简单处理可得到对比度更高的图像


matlab代码

clear;clc;
I = im2double(rgb2gray(imread('C:\Users\Bob Xiao\Desktop\3.png')));
% I(1,1)
[rows, cols] = size(I);
add = floor(cols/16);
windowSize = add*2+1;
newImg = padarray(I, [add,add]);    %填充边界之后的图片

bgImg = zeros(rows,cols);
for i=add+1:add+rows
    for j=add+1:add+cols
        myWin = newImg(i-add:i+add,j-add:j+add);
        bgImg(i-add,j-add) = AvgWin(myWin);
    end
end

pImg = I + bgImg;
            
figure(1);
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imshow(newImg);
subplot(2,2,3);
imshow(bgImg);
subplot(2,2,4);
imshow(pImg);

function [M] = AvgWin(IN)
% 传入一个矩阵,求均值
avg = mean(mean(IN));
M = avg;
end

写在后面:这个算法的时间复杂度非常高,达O(mnp2),(其基本操作:求窗口均值,内部的时间复杂度为O(n^2)),因而不适合实际应用。
Note:另有积分图方法,只需遍历一次图片,时间复杂度仅为O(mn)。

你可能感兴趣的:(MATLAB,图像处理,均值滤波器,matlab)