http://www.aiseminar.cn/bbs/thread-262-1-1.html
在最近看到的论文中有提到使用块编码进行图像匹配的算法,由此可见,块操作在图像处理、识别中运用相当频繁。而matlab图像处理工具箱中也提供了相应的函数。块处理函数所做的工作就是将整幅图像分成一个个的块,对每一块进行处理,再将处理结果拼接成一副完整的图像。
块操作大致有两类:一种是滑块邻域操作,另一种是分块操作。
1. 滑块邻域操作
滑块邻域操作一次运算输出图像的一个像素,输出图像的像素值由该像素对应的输入图像像素位置的邻域像素来决定,该目标像素被称为“中心像素”。其邻域为矩形,当邻域的行、列数均为奇数时,中心像素位于邻域的中心;当邻域的列数为偶数时,中心偏左;当邻域的行数为偶数时,其中心偏上。比如,m*n的矩形邻域,其中心像素的位置为[x, y] = floor(([m n] + 1) / 2)。随着目标像素的移动,邻域也发生同方向的移动。两次邻域可以有重叠部分(如下图示)。
处理边界或靠近边界的像素的邻域像素并不在图像上。滑块邻域操作对这种情况的处理是认为位于图像区域之外的假设像素值为0。这种情况成为“边界的填充”。
滑块邻域操作通常用于图像的滤波,比如计算卷积、线性滤波、非线性滤波等。
2. 分块操作
分块操作是将图像分为一个个相等的矩形块,一次单独处理一个块来决定输出图像相应块的像素值。如果一幅图像不能被恰好分成整数个矩形块,则在超出图像区域以外的像素位置以0填充。
函数blkproc执行分块操作,它从图像中取出每个块,然后传递给其他函数处理,再由自己将处理后的各块组装起来形成输出图像,常用调用格式为:
B = blkproc(A, [m n], fun)
其中A为输入图像,B为输出图像,[m n]指定块大小,fun指定对所有块进行处理的函数。
3. 例:将图像(256 * 256)分成10 * 10的块集,然后将块中各个元素的值设为此方块的均值。
- clc, clear
- I = imread('cameraman.tif');
- fun = inline('mean(mean(x)) * ones(size(x))');
- I2 = blkproc(I, [10 10], fun);
- figure('name', 'football.jpg原图')
- imshow(I);
- figure('name', '块均值处理后图像')
- imshow(I2, []);
输出如下:
由处理后图可以看出,图像的右边缘和下边缘有黑边,这就是256 / 10 后,边界填充的4像素块的边界。