在使用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';你就可以随意使用啦!