关闭

5 图像的邻域和块操作

1822人阅读 评论(0) 收藏 举报
分类:

        在很多图像处理过程中,对图像分块操作而不是同时处理整幅图像的方法是非常通用而且有效的,尤其是在后面章节中将要介绍的图像滤波和图像形态学操作中有很重要的应用。相比全图像操作,图像分块操作至少有以下 3 个优点:

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

            • 节省运算时占用的存储空间;
            • 降低计算的复杂性,提高处理速度;
            • 充分考虑图像的局部特性。
        本节将会结合图像块操作的类型,介绍几个通用的图像块操作函数。这些块操作函数通常需要指定图像块的大小和对图像块进行特定处理的功能函数。图像块操作的类型有两种:

     • 非重叠块操作(distinct block)
     • 滑动邻域操作(sliding neighborhood)

        这两种操作都是基于一个图像块的整体操作,按照指定的图像处理功能函数得到仅涉及该图像块的计算结果,而且,在对原图像进行块操作时,都可以根据需要指定不同大小的矩形块。然而,不同的是,非重叠块操作对原图像的划分不存在重叠区域,而且在对某一图像块进行处理后,得到的是对应输出图像中同样大小的图像块;滑动邻域操作是基于像素级的操作模式,以原图像某像素点为中心,以指定大小的图像块作为该像素点的邻域,对该像素点的整个邻域进行处理,每次处理后仅得到输出图像中对应像素点的值,而不是一个图像块的计算结果,而且,接下来不改变邻域的大小,仅仅移动邻域的中心像素位置,从而计算出所有的输出图像像素值,在这一过程中相邻图像邻域很明显有重叠区域。


1.非重叠图像块操作

      非重叠图像块的定义将图像的数据矩阵划分为同样大小的矩形区域,不同的图像块在图像上面排列,相互之间没有重叠。它的排列顺序是从左上角开始。如果图像不能恰好被划分,则在图像的右、下部对其补零。如图所示,一个 15×30 的图像按照 4×8 的图像块进行划分,结果在图像的右边补了两列“0”,在图像的下边补了一行“0”。

    另外,对于一些特别的图像处理操作,可能还需要进行一些特别的图像块划分,即包含有“重叠(Overlap)”定义区域的非重叠(Distinct)图像块划分方式,


  图中阴影区域表示对图像块进行补“0”操作。


           MATLAB 提供了一个通用的非重叠图像块操作函数 blkproc,其语法格式为:

          B = blkproc(A,[m n],fun)
          B = blkproc(A,[m n],fun,P1,P2,⋯)

          B = blkproc(A,[m n],[mborder nborder],fun,⋯)
          B = blkproc(A,’indexed’,⋯)

          B = blkproc(A,[m n],fun)其中[m n]表示按 m×n 的图像块划分对图像 A 做运算,fun 为运算函数,其形式为 y=fun(x),x 表示被操作的图像块。

          B=blkproc(A,[m n],fun,Pl,P2,⋯)指定 fun 中除 x 以外的其他参数 P1、P2、⋯⋯
          B=blkproc[A,[m n],[mborder nborder],fun,⋯]指定图像块的扩展边界 mborder 和 nborder,使得实际操作的图像块大小为(m+2*mborder)*(n+2*nborder)。如图 3-13 所示的包含有“重叠(Overlap)”定义区域的非重叠(Distinct)图像块划分方式,阴影部分即为扩展边界大小,在该图中,扩展边界[mborder nborder]为[1 2]。

          B = blkproc(A,’indexed’,⋯)表示被处理图像 A 为索引色图像。


  例:

 B=imread('C:\Users\Administrator\Desktop\picture\MATLAB图像处理\part5\1.jpg');
fun=inline('std2(x)*ones(size(x))');
A=rgb2gray(B);      %将rgb图转换为灰度图
I1=blkproc(A,[3 3],[2 2],fun);
I2=blkproc(A,[3 3],fun);
I3=blkproc(A,[5 5],fun);
figure,imshow(A),title('原图像');
figure,imshow(I1),title('I1');
figure,imshow(I1,[]),title('I1');
figure,imshow(I2,[]),title('I2');
figure,imshow(I3,[]),title('I3');




2.滑动领域操作

   在MATLAB中,滑动领域是一个像素集,像素集包含的元素由中心像素的位置决定。滑动邻域操作一次只处理一个图像像素。当操作从图像矩阵的一个位置移动到另一个位置时,滑动邻域也以相同的方向运动,其示意图如图所示。

图 中的滑动邻域是一个 2×3 的矩阵,黑点表示中心像素。对于 m×n 的滑动邻域来说,中心像素的位置是:

 floor([(m+1)/2, (n+1)/2])
其中,floor 表示对其参数的每一个分量向下就近取整,因此,对于 2×2 邻域,其中心就是(1,1),图 3-15中 2×3 滑动邻域的中心就是(1, 2)。

  在 MATLAB 中进行滑动邻域操作的具体步骤如下:
(1)选择像素;
(2)确定该像素的滑动邻域;
(3)调用合适的函数对滑动邻域中的元素进行计算;
(4)将计算结果作为输出图像中对应像素的值;
(5)重复计算,遍及图像中的所有像素。

MATLAB 工具箱提供了一个通用的滑动邻域操作函数 nlfilter。利用 nlfilter 函数可以实现滑动邻域的移动操作,并把待处理图像、邻域大小和一个处理函数(返回值为标量)作为参数,返回与输入图像大小相同的图像作为输出结果。其语法格式为:

    B = nlfilter(A,[m n],fun)
    B = nlfilter(A,[m n],fun,P1,P2,⋯)
    B = nlfilter(A,’indexed’,⋯)

    B = nlfilter(A,[m n],fun)表示对图像 A 进行操作得到图像 B,其中,[m n]表示滑动邻域的大小为 m×n,fun 是作用于图像邻域上的处理函数。函数 fun 的输入是大小为 m×n 的矩阵,返回值是一个标量值。假定 x 表示某一个图像邻域矩阵,c 表示函数 fun 的返回值,则有表达式 c = fun(x),c 就表示对应图像邻域 x 的中心像素的输出值。

B = nlfilter(A,[m n],fun,P1,P2,⋯)可以传递参数 P1,P2,⋯给函数 fun。
B = nlfilter(A,’indexed’,⋯)把图像 A 作为索引色图像进行处理,如果图像数据是 double 类型,则对其图像邻域进行填补(Padding)时,对图像以外的区域补“1”,而当图像数据为uint8 类型时,用“0”填补空白区域。

函数 nlfilter 的参数 fun 可以是一个函数句柄或是一个内联函数,看下面的例子。
(1)fun 作为一个函数句柄
B = nlfilter(A,[3 3],@myfun);
这里,myfun 表示一个 M 文件,其中包含以下语句:
function scalar = myfun(x)
scalar = median(x(:));

(2)fun 作为一个内联函数
fun=inline(’median(x(:))’);

例:

计算输入图像的 3×3 邻域(被处理像素本身和其周边的八个邻域在内的九个像素点)像素值的最大值作为输出像素点的像素值。作为参数的处理函数(最大值函数 max)采用内联函数形式

B=imread('C:\Users\Administrator\Desktop\picture\MATLAB图像处理\part5\1.jpg');
>> A=rgb2gray(B);%转换成灰度图像
>> f=inline('max(x(:))');
>> J=nlfilter(A,[3 3],f);
figure,imshow(A),title('原图像');
figure,imshow(J,[]),title('结果图像');



 所示是在执行上述代码时弹出来的状态条,显示执行的进程,整个计算过程用了大约 1 分钟的时间,处理结果如图  所示。


下一节的内容会向大家介绍一个快速进行图像块处理的函数,colfilt,比较完成相同处理任务两者耗费的时间差异,表明后者的计算复杂度明显降低。


3. 图像块处理的快速算法

        前面讲到的非重叠图像块操作和滑动邻域操作都是对原图像进行划分,进而对每个图像块矩阵逐个调用处理函数进行操作。然而,在前面我们举的一个滑动邻域操作的例子,可以看到,为了对一幅 一般的灰度图像执行这一操作,用时大约 1 分钟。可想而知,如果是处理更大的图像,或者是作用更复杂的处理函数,其处理时间会更长。

     为了加快图像块处理的速度,MATLAB 图像处理工具箱提供了一个快速处理函数 colfilt,可以处理非重叠图像块操作和滑动邻域操作。该函数在处理过程中,会首先把要处理的图像块(非重叠块或滑动邻域)重新按列组合成一个临时矩阵,继而对该临时矩阵的每一列(对应着每一个要处理的图像块)调用处理函数。在这一过程中,因为实现了矩阵式操作,大大提高了处理速度,根本没有弹出如上图 所示的状态条,几乎是立刻得到完全一样的计算结果。

    如图所示,(a)表示利用函数 colfilt 对一个6×5 大小的图像进行滑动邻域操作,滑动邻域的大小为 2×3,可以看到,所有要处理的滑动邻域被映射到一个临时矩阵,该矩阵的一列就代表一个滑动邻域,从而得到临时矩阵的大小为 6×30;(b)表示利用函数 colfilt 对一个 6×16 大小的图像进行非重叠图像块操作,非重叠图像块的大小为 4×6,将所要处理的图像块映射到一个临时矩阵,矩阵的一列就代表一个非重叠图像块,从而得到临时矩阵的大小为24×6。


    colfilt 函数的语法格式如下:
   B = colfilt(A,[m n],block_type,fun)
   B = colfilt(A,[m n],block_type,fun,P1,P2,⋯)
   B = colfilt(A,[m n],[mblock nblock],block_type,fun,⋯)
   B = colfilt(A,’indexed’,⋯)

   B = colfilt(A,[m n],block_type,fun)表示对图像A实现快速的以函数fun表示的图像块操作得到输出图像 B,图像块的尺寸为 m×n,block_type 指定了图像块的类型,即

  block_type=’distinct’,非重叠图像块
  block_type=’sliding’,滑动邻域
  fun 为运算函数,其形式为 y=fun(x)。
  B = colfilt(A,[m n],block_type,fun,P1,P2,⋯)指定 fun 中除 x 以外的其他参数 P1、P2、⋯。

  B = colfilt(A,[m n],[mblock nblock],block_type,fun,⋯)是一种节省内存的处理方法。从colfilt 生产临时矩阵的方法,读者可以看到该种处理方法将比寻常的图像块操作方式占用更多的内存。为了既提高图像块处理的速度,又能节省占用的内存,该语句实现把图像 A 分割成 mblock×nblock 大小的子图像,同时只是对该子图像进行操作,通过多次调用函数 fun 来完成整幅图像的操作。这种方法的计算结果与不进行子图像分割是完全一样的。

 例:同样采用在滑动邻域操作中介绍的例子来说明函数 colfilt 的应用,并比较处理速度。

B=imread('C:\Users\Administrator\Desktop\picture\MATLAB图像处理\part5\1.jpg');
A=rgb2gray(B);%转换成灰度图像
f=inline('max(x)');

J=colfilt(A,[3 3],'sliding',f);
figure,imshow(A),title('原图像');
figure,imshow(J,[]),title('J');

 

 注意:这里 f 的定义是 max(x),而不是 max(x(:))。这是因为在原图像中,每个像素的邻域已经被排列成列向量。

同样,也可以利用 colfilt 函数对输入图像进行’distinct’类型的块操作,即非重叠图像块操作,处理速度也会比 blkproc 函数要快。然而,colfilt 并不能完全代替 blkproc 函数,而是有以下限制:

   • 输出图像必须和输入图像的尺寸相同;
  • 图像块不能有重叠,即不能处理包含有“重叠(Overlap)”定义区域的“非重叠(Distinct)”图像块划分方式。
在这两种限制情况之外,就只能调用 blkproc 函数。


更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:92852次
    • 积分:1840
    • 等级:
    • 排名:千里之外
    • 原创:88篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    最新评论