matlab中图像块(patch)处理命令小结

在使用MATLAB语言实现图像处理算法时,我们常常会遇到需要对图像块(patch)进行运算的情况。受到其他语言编程习惯的影响,循环通常是不假思索的第一选择。但由于matlab是利于矩阵运算的编程语言,采用循环只会低效和耗时。

因此,下面总结了在图像处理中遇到的块运算常用的命令及代码,希望对大家有所帮助。

1. nlfilter

调用格式:B = nlfilter(A, [m n], fun);

意为对图像A的每个大小为m*n的patch进行fun函数的操作,patch的取法为滑动(sliding),即patch的中心像素遍历图像的每个点,当取到边界时需要进行边界延拓。fun必须是函数的句柄,可自由定义也可取matlab内置的函数。

例:

对图像I的每个5*5邻域进行取标准差的运算 :I2= nfilter(I,[5,5],@std2);

2. blockproc

不重叠的块运算命令(distinct block processing)

调用格式:B = blockproc(A,[M N],fun);

意为对图像A的每个不重叠的大小为m*n的块进行fun函数的操作,级联的结果为B。

例:

对图像I的每个5*5邻域进行取标准差的运算:fun = @(block_struct) ...

   std2(block_struct.data) * ones(size(block_struct.data));

I2 = blockproc(I,[5 5],fun);

另:

还有个命令blkproc,功能已被matlab不推荐使用,不再赘述。

3. colfilter

调用格式:B = colfilt(A,[m n],block_type,fun)

意为将图像A重排成每列为m*n块拉成一列组成的临时矩阵,对该临时矩阵进行fun函数的操作。

例:

对图像的I的每个5*5邻域进行取标准差的运算 :I2 = uint8(colfilt(I,[5 5],’sliding',@std));

另:

在调用fun函数处理前,colfilt先调用了im2col生成了临时矩阵,调用fun函数处理之后,又调用col2im将成列的矩阵重排为块。

colfilt与blockproc及nlfilter相比,用法类似,但速度更快。

4. im2col and col2im

im2col将图像分块拉成列重排。patch取法有两种:’distinct’和’sliding’。

调用格式:B = im2col(A,[m n],block_type)

例:

  img = im2double(imread(‘lena.png’));

  p  = im2col(img , [y, x], ‘sliding’);

将大小为Y*X的图像分为y*x的块,imcol生成的B矩阵的大小为(Y-y+1)*(X-x+1).

若要得到与原图同样大小的图像,col2im做不到,你需要下列函数。


 实现真正的“col2im”功能的函数

下载工具箱 http://hvrl.ics.keio.ac.jp/charmie/file/demo_patching.zip

将demo_patching.m的第二行改为if(nargin < 4), border = ‘on';你就可以随意使用啦!

你可能感兴趣的:(图像处理)