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

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

软件环境 matlab R2017a

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


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

例如要把这张图片二值化,用于后续识别使用全局的阈值划分,可能会得到以下结果一个更极端的例子
在这里插入图片描述左下角的区域被错误处理在这里插入图片描述

显然,我们希望得到如下结果
在这里插入图片描述
要得出这样的结果就需要对暗处进行补偿、降低过曝处亮度,因此有了滤波器的方案


理论基础

均值滤波器相关理论

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

方案实施

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

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

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

  2. 如果我们对它取反,这个图片就成为了一个亮度补偿数据,与原图片相加,可以得到在这里插入图片描述
    至此,我们的目的基本达到了,后续只需做简单处理可得到对比度更高的图像


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)。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值