Steve用MATLAB进行图像处理

图像处理概念,算法,和MATLAB

填料膨胀和侵蚀

这是我的另一个帖子形态膨胀和侵蚀算法系列

使用的一种算法技术imdilate而且imerode为二值图像位填充。在位包装中,32个二进制图像像素组作为位存储在无符号32位整数中。

图像处理工具箱功能bwpack而且bwunpack打包和拆包。让我们看一个简单的例子,从读取text.png开始,然后提取一个32 × 4的子图像。

bw = imread (“text.png”);imshow (bw)
Bw_sub = bw(12:41, 30:33)
bw_sub = 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1

现在将子图像传递给bwpack

bw_sub_pack = bwpack(bw_sub) whos . bw_sub_pack = bwpack(bw_sub) whos . bw_sub_pack
bw_sub_packing = 1572864 1040187640 1065354238 1065354238 bw 256x256 65536 logical bw_sub 30x4 120 logical bw_sub_packing 1x4 16 uint32

bw_sub_packed是1 × 4吗uint32矩阵,但这4个值包含了原始32 × 4子图像中的所有值。您可以通过使用dec2bin函数,该函数将十进制数转换为二进制形式(表示为字符串)。

将bw_sub_packed(1,2)转换为二进制形式。dec2bin (bw_sub_packed(1、2)
ans = 111110000000000000000011111000

的第二列中的0和1值bw_sub

那么这与膨胀和侵蚀有什么关系呢?二值图像的膨胀和侵蚀可以用像素值的平移、逻辑和和逻辑or表示。C和c++操作符>><<,|按位操作无符号整数值。因此,通过将二进制图像像素值打包到无符号32位整数的位中,我们可以编写扩展和侵蚀更快的C或c++代码,因为它本质上是一次操作多个像素值。

让我们尝试对text.png进行打包,将打包后的图像传递给imdilate,然后解包结果。(注意,imdilate支持32位整数图像,所以我们必须显式地告诉imdilate将输入视为包装好的。)我们将使用对角线交叉结构元素。

bw_packed = bwpack (bw);Se = strel(eye(9) | rot90(eye(9)));bw_packked_dilated = imexpand (bw_packed, se,“ispacked”);bw_dilated = bwunpack (bw_packed_dilated);imshow (bw_dilated)

让我们用2k * 2k的图像进行时间压缩膨胀,并将其与普通版本进行比较。

Bw = repmat(Bw, 8,8);bw_packed = bwpack (bw);Packed_dilation_time = timeit(@() imdilate(bw_packed, se,“ispacked”))
packed_dilation_time = 0.0127
Ordinary_dilation_time = timeit(@() imdilate(bw, se))
ordinary_dilation_time = 0.0396
Speedup = ordinary_dilation_time / packed_dilation_time
加速= 3.1251

测量到的加速是不错的,但比我们预期的32倍要少得多。加速因子变小有两个原因:

  • imexpand .m中的输入参数解析和其他开销
  • 工具箱用于普通膨胀的c++代码使用了一种方法,它在白色输入像素相对较少的情况下表现更好,而该方法不能有效地用于打包版本。

这里有一个你需要考虑的设计问题:应该imdilate总是使用包装的形式?换句话说,如果你传入a逻辑输入,应该imdilate打包,进行打包扩张,然后再拆封?

打包和拆包都需要时间。例如:

时间(@ ()bwpack (bw))
ans = 0.0198

因此,可以想象的是,包装、包装扩张和拆封一起花费的时间可能比普通的扩张实施要长。

我们决定imdilate(和imerode)应仅在结构元被分解为至少两个结构元时才自动进行位填充。这样,包装和拆包装的成本被摊在至少两次包装膨胀操作的成本上。

最近,我们一直在重新审视形态学操作的各个方面,我们很乐观地认为,在图像处理工具箱的未来版本中,我们可以使它们运行得更快。




与MATLAB®7.7发布

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。

Baidu
map