如何求图像均值和标准差
从去年开始学习Matlab,主要用它来处理图像,虽然也写了一些代码,但大多还是得依靠众多博友和度娘的帮助,然后现在得学习怎么融会贯通地使用写出自己的代码,希望通过发博客互相沟通交流能让自己的进步更快一点(●’◡’●)。
今天要做的是类似均值滤波,通过使用5×5的滑动窗来求取该滑动窗内25个像素的均值和标准差。主要涉及到sum函数、二维矩阵卷积函数conv2、ones函数、imfilter函数、标准差的计算原理,以及在这个过程中遇到的一些问题。
1、均值
1.1 sum函数
利用滑动窗和sum函数求和,边界两行两列的像素不参与计算,维持原值,也就是说,从第三行第三列的像素值开始计算。要同时进行行和列的计算,也就是以某一像素点M(i,j)为中心,对它周围及自身的像素求和,如下所示,同时写出了sum函数的示例。此外,sum函数有时会遇到“下标索引必须为正整数类型或逻辑类型”的问题,这个时候就要检查设定的下标的起始和结尾的值。
5×5滑动窗 | Matlab代码示例 | |||||
---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | a=sum(sum(M(i-2:i+2,j-2:j+2)));%滑动窗求和,N=5,则半径r=2 | |
1 | 1 | 1 | 1 | 1 | a=sum(x);%对矩阵每一列求和,生成行向量 | |
1 | 1 | M(i,j) | 1 | 1 | a=sum(x,1);%对矩阵每一列求和,生成行向量 | |
1 | 1 | 1 | 1 | 1 | a=sum(x,2);%对矩阵每一行求和,生成列向量 | |
1 | 1 | 1 | 1 | 1 | a=sum(x(: ));%对矩阵内所有元素求和,生成一个值 |
总的Matlab代码如下:
img=imread('LS.png');%读入图像
[h, w]=size(img);
mean=zeros(h, w);
for i=1:h
for j=1:w
if i>=3 & i<=(h-2) & j>=3 & j<=(w-2) %不对边界进行处理
mean(