「二十九」MATLAB数字图像运算之块操作

(30) 2023-10-06 16:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说「二十九」MATLAB数字图像运算之块操作,希望能够帮助你!!!。

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第1张

在图像处理中,我们经常会遇到这样的需求,即只想要对图像的局部进行图像处理,而不是对图像的整体进行图像处理。这时候,我们就需要考虑图像的分块操作思想。

MATLAB中,针对图像块操作的不同类型,提供了不同的块操作函数。例如nlfilter()函数是基于滑动邻域的操作,blkproc()函数是基于非重叠块的图像处理。此外,MATLAB图像处理工具箱还提供了colfilt()函数,用于实现图像的快速邻域操作,达到加快图像块处理的速度。

实际上,图像块操作的类型有两种:非重叠块操作和滑动邻域操作。

非重叠块操作:对原图像的划分不存在重叠区域,且划分的区域是同样大小的;从图像左上角开始划分,若图像不能被恰好划分,则在右下角补零;对某一图像块进行处理后,得到的是对应输出图像中同样大小的图像块

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第2张

非重叠块操作示意图

滑动邻域操作:是基于像素级的操作模式,以原图像某像素点为中心,以指定大小的图像块作为该像素点的邻域,对该像素点的整个邻域进行处理,每次处理后仅得到输出图像中对应像素点的值,而不是一个图像块的计算结果,而且,接下来不改变邻域的大小,仅仅移动邻域的中心像素位置,从而计算出所有的输出图像像素值,在这一过程中相邻图像邻域很明显有重叠区域。

滑动邻域的中心点位置:设滑动邻域的大小为m*n,则中心点位置为floor([m+1 n+1]/2);例如邻域2*2———>[1 1],邻域2*3——>[1 2]。

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第3张

滑动邻域操作示意图

下面,就对MATLAB中的块操作函数作介绍:

在MATLAB图像处理工具箱中提供了一个通用的blkproc()函数,用于非重叠图像块操作。该函数的调用格式如下:

  • B = blkproc(A,[m n],fun):表示按 m×n 的图像块划分图像 A,并做fun函数定义的运算,必要时要补零;fun为一种运算函数,其形式为 y=fun(x),x表示被操作的图像块。

  • B = blkproc[A,[m n],[mborder nborder],fun]:指定图像块的扩展边界mborder和nborder,使得实际操作的图像块大小为(m+2*mborder)*(n+2*nborder)。这种情况下,各图像块之间可以重叠,因为每个图像块都会额外增加一定的行和列。

  • B = blkproc(A,’indexed’,⋯):用于索引色图像的块操作。

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

  • B = nlfilter(A, [m n], fun):对图像A进行操作,得到图像B。其中[m n]表示滑动领域大小为m*n;参数fun为基于滑动邻域的处理函数,返回值为一个标量;例如x表示邻域,则有表达式c=fun(x),c为一个标量,表示对应图像邻域x的中心像素的输出值;

  • B = nlfilter(A, 'indexed',...):用于索引图像的滑动邻域操作。若图像数据位double类型,则当对图像邻域进行填补时,图像以外的区域补“1”;若为uint8类型,则图像以外的区域补“0”。

为了加快图像块处理的速度,MATLAB图像处理工具箱提供了一个快速处理函数colfilt(),可以处理非重叠图像块操作和滑动邻域操作。该函数的调用格式如下:

  • B = colfilt(A,[m n],block_type,fun):实现快速块处理;block_type=’distinct’,表示非重叠图像块;block_type=’sliding’,表示滑动邻域;

  • B = colfilt(A,[m n],[mblock nblock],block_type,fun):为了节省内存,按mblock*nblock的图像块对图像A进行块处理;

  • B = colfilt(A,’indexed’,⋯):将A作为索引图像处理。当A的数据类型为uint8或uint16,用”0“填充;当A的数据类型为double或single,用”1“填充。

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第4张

快速块操作生成临时矩阵示意图

下面,提供一个简单实例来具体说明上述函数的用法和处理效果:

代码:

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第5张

demo1

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第6张

demo2

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第7张

demo2

显示效果:

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第8张

demo1运行时间

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第9张

demo2运行时间

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第10张

demo3运行时间

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第11张

demo1_figure1

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第12张

demo1_figure2

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第13张

demo1_figure3

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第14张

demo2

「二十九」MATLAB数字图像运算之块操作_https://bianchenghao6.com/blog__第15张

demo3

从上面的运行结果可以看出,MATLAB提供的快速块操作函数确实是运行时间短,运行速度快的!

最后,感谢您的耐心阅读!

MATLAB的世界

MATLAB语言之程序性能优化

上一篇:MATLAB数字图像运算之图像配准

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复