该书指出,在图像处理中,扩张用于“加厚”二进制图像中的对象。此外,作者在示例中使用imdilate
来修复或加厚扫描文档中的损坏文本。 imdilate
填补了扫描不良的文本文档中的空白和裂缝。
因此,在膨胀的方式中,形成的新图像采用结构元素的形状,或者换句话说,即使结构化元素的一个像素与图像中的对象重叠,对象的像素也在图像的方向上延伸。结构元素。
因此,为了自己测试,我编写了简单的代码来了解它是如何工作的。我在这张图片上用过它:
这是我写的代码:
logical = imread('edifice.jpg');
line = strel('line', 30, 45);
square = strel('square', 30);
%dilate logical with line @ 45 degrees
dial_logical_line = imdilate(logical, line);
figure, imshow(dial_logical_line), title('dial logical line');
%dilate logical with square.
dial_logical_square = imdilate(logical, square);
figure, imshow(dial_logical_square), title('dial logical square');
用线结构元素扩张产生了这个:
用方形结构元素扩张产生了这个:
现在根据我上面所理解的定义,我期待不同的结果。在线条的情况下,我希望手表能够以45度角涂抹,如果是方形结构元素,我期待一个黑色正方形。
可以肯定地说,根据我的理解,我不理解我得到的结果。
答案 0 :(得分:4)
imdilate
增强了明亮区域,因此如果您希望在第二种情况下使用黑色方块,则可以尝试imerode
:
file='http://imgur.com/ka2wLqK.jpg';
logical = rgb2gray(imread(file));
square = strel('square', 30);
dial_logical_square = imerode(logical, square);
figure, imshow(dial_logical_square), title('dial logical square');
明亮区域被消除,黑色区域正在扩展:
关于你的第一个案例,我仍在努力了解你的期望结果是什么?看起来好imdilate
为你增加45度的所有明亮区域。事实上,imerode
和imdilate
经常结合起来以达到一些效果。您可以保持线条沿45度和足够厚的亮度,并通过侵蚀(去除小亮线)然后扩大(增强粗亮线)图像来消除其他线条(变成黑色)。 imopen
为您执行此操作:
file='http://imgur.com/ka2wLqK.jpg';
logical = rgb2gray(imread(file));
imshow(logical)
line = strel('line', 10, 45);
dial_logical_line = imopen(logical, line);
figure, imshow(dial_logical_line), title('dial logical line');
答案 1 :(得分:3)
这对我来说很好看。请记住,在二进制图像中,感兴趣的像素是1值或白色像素。你可以看到原始图像中的每个(白色)像素都被“涂抹”成45度线和正方形 - 如果先颠倒图像,你会看到手表本身会发生什么,而不是背景; )
答案 2 :(得分:1)
您可以在二进制图像中尝试Morphological Operations(MO)。 MO保留了细线并用作过滤器,并消除了图像中的噪点。您可以组合一系列MO,以获得最佳结果,并重复n或Inf次。我在Matlab中使用bwmorph执行了代码;
I = imread('clock1.jpg');
logical= rgb2gray(I);
imshow(logical);
L2 = imbinarize(logical);
I2 = bwmorph(L2,'majority',4);
I3 = bwmorph(L2,'spur',2);
I4 = bwmorph(I3,'fill',2);
I5 = bwmorph(I4,'clean',1);
figure, imshow(I5),title('Morphological operations');>
输出图像如下: