我有一些文本文档,我希望将文本细化为不同的宽度,例如2像素宽笔画,4像素宽等等。
我知道matlab已经在bwmorph
中使用了细化算法,并且可以使用
thinned = bwmorph(bw_image, 'thin', 'n=Inf');
但这会使图像变薄为1像素宽。更改n
的值不会产生所需的结果。有什么办法可以确保减薄到n像素宽度吗?
答案 0 :(得分:5)
你总是可以先对角色进行细化,然后通过执行形态学来人为地扩展它们的骨骼。对于扩展,morphological dilation是最合适的。因此,使用标准细化算法使字符变细,然后在使用具有良好尺寸的合适结构元素之后扩展结果。结构元素的大小应该决定稀疏结果的厚度。
为了进一步举例说明我的观点,以下是我在Google上找到的图片示例:
用MATLAB读取并转换为二进制文件:
im = im2bw(imread('https://lh3.ggpht.com/aWaaZ-BsAXSYyyHRlube_NkiB-Q-FDx-Wpgg8qi5jqrNvAvNp87amEwSUNr7PdbCizY=w300'));
这就是我们得到的:
执行细化会给我们:
thinned = bwmorph(im, 'thin', 'n=Inf');
如果要增加细化结果的厚度以使厚度为n
像素,请使用大小为n x n
的基本方形结构元素,并将其与imdilate
函数一起使用,对二进制图像进行形态膨胀。通常,要增加文本的厚度以使{strong>整体厚度为n
像素,您可以选择方形结构元素的大小为n
。
以下是我上面讨论过的一些例子。
n = 2
这会将细化增加到2像素宽:
se = strel('square', 2);
expand = imdilate(thinned, se);
imshow(expand);
函数strel
定义了不同的结构元素,但我们将通过'square'
标志选择方形元素。将上面看到的稀疏图像展开,我们得到:
n = 5
只需将结构元素更改为5 x 5,我们就得到:
se = strel('square', 5);
expand = imdilate(thinned, se);
imshow(expand);
如果您获取任何结果并放大文本,您将看到每个笔划的宽度确实是2或5像素。然而,上述代码的假设是每个字符被充分分开以允许保持每个笔划的可变厚度。如果角色非常接近,那么扩张会将这些文本字符合并在一起......但是细化算法很可能在扩张之前给你带来不好的结果。