Steve用MATLAB进行图像处理

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

结构化元素分解“有问题”

在我之前的帖子中膨胀和侵蚀算法,我写了如何利用结构化元素分解来提高速度。今天我想讨论一个潜在的分解问题:如果不仔细执行分解的膨胀和侵蚀,很容易在图像边界附近得到错误的答案。

这里有一个例子来说明可能出现的问题,从一个只包含一个前景像素的二进制图像开始;

一个= false (5,5);(3) = true
A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

下面是一个结构元素:

B = [1 0 0;1 1 0;1 1 1;0 1 1;0 0 1]
B = 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1

计算的膨胀一个通过b使用imdilate

A_b = imdilate(A, b)
A_b = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0

结构化元素b可以分解成两个更小的结构元素,b1而且b2

b1 = [1;1;1]
B1 = 1 1 1
B2 = [1 0 0;0 1 0;0 0 1]
B2 = 1 0 0 0 1 0 0 0 1

形态学理论(实际上,只是你在高中学过的分配律)认为我们应该能够扩张一个通过b1,然后将结果放大b2,以得到与扩张相同的结果一个通过b.让我们试试。

A_b1_b2 = imexpand (imexpand (A, b1), b2)
A_b1_b2 = 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0

哦哦。比较A_b而且A_b1_b2仔细看看它们是不是一样的。那么,我们哪里做错了呢?粗略地说,我们没有考虑到膨胀的影响图像边界之外.如果你把整个图像平面都考虑进去,膨胀通过b1影响原始图像边界以外的像素。当我们放大时,超出边界的像素会影响到内边界的结果b2.但在电话里imdilate (imdilate (A、b1)、b2)上面,每个呼叫到imdilate返回仅为输入图像大小的结果;受影响的越界像素被裁剪掉。

让我们再试一次,但这一次我们将在输入图像上预先填充0。

A_p = padarray(A, [1 1], 0,“两个”
A_p = 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 0 0 0 0 0

现在扩张b1而且b2在继承:

A_p_b1_b2 = imexpand (imexpand (A_p, b1), b2)
A_p_b1_b2 = 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 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0

修剪掉填充的行和柱:

a_p_b1_b2_裁剪= A_p_b1_b2(2:end-1, 2:end-1)
a_p_b1_b2_裁剪= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0

成功!这一结果等于A_b

这意味着我们需要做出取舍。使用结构元素分解可以显著提高速度,但只有使用额外的内存对输入图像进行填充复制,才能保证在图像边界处得到正确的结果。这就是imdilate而且imerode做的。

在这个关于膨胀和侵蚀算法的系列中,我还有两个简短的主题。我会尽量在12月把事情做完。




与MATLAB®7.7发布

|
  • 打印
  • 发送电子邮件

评论

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

Baidu
map