1.图像的滑动邻域操作。
邻域操作是指将每个输入的像素值以及其某个邻域的像素值结合处理而得到对应的输出像素值的过程。邻域通常形状规则。如2*2,2*3之类。
滑动邻域操作一次处理一个像素。
对于m*n的邻域,中心像素坐标为:floor(([m,n]+1)/2);
例如:邻域2*2——>[1 1]
邻域2*3——>[1 2]
实现滑动邻域操作的步骤:
(1) 选择一个单独的像素。
(2) 确定该像素的滑动邻域。
(3) 对邻域中的像素值应用一个函数求值,该函数将返回标量计算结果。
(4) 将计算结果作为输出图像中对应的像素的值。
(5) 对输入图像的每个像素都重复以上步骤。
滑动邻域操作函数:
①
Y=nfilter(X,’index’,[m,n],fun,P1,P2....); %对图像X以邻域[m,n]进行fun函数操作。
其中,index为可选参数。若指定,则意为将图像作为索引图像处理。
例如:
对图像I的每个3*3邻域进行标准方差的运算 :I2= nfilter(I,[3,3],’std2’);
或者:
B=nfilter(A,[3,3],@myfun); %计算函数是自定义的,在myfun.m文件中。
②
Y=colfilt(X,[m,n],blocktype,fun);
其中,blocktype表示块的移动方式,有两个取值:distinct(分离块)、sliding(滑动块)。
与nfilter相同,fun函数也可以是自定义的,
例如:
func=inline(‘min(x)’);
J=colfilt(I,[6,6],’sliding’,func);
2.图像的块操作。
对应分离块进行操作的函数:
Y=blkproc(X,[m,n],[mborder,nborder],fun,P1,P2...);
其中,[mborder,nborder]指定了图像的扩展边界,即扩展后图像大小为[m+2mborder,n+2nborder]。
例如:
B=blkproc(A,[4,6],[2,3],fun,...); %分离块大小为4*6,行边界为2,列边界为4,因此fun函数操作的图像大小实际为8*12。
同样的,fun也可以使用一个内联对象,例:
I=imread(‘alumgrns.tif’);
fun=inline(‘std2(s)*ones(size(x))’);
I2=blkproc(I,[8,8],'std2(x)*ones(size(x))'); 注:此处,不再是fun。
Imshow(I);
Figure,imshow(I2,[]);