我有一些文本文档,我想把文本细化到不同的宽度,比如2像素宽的笔划,4像素宽的等等。
我知道matlab已经有了bwmorph中的细化算法,可以使用

thinned = bwmorph(bw_image, 'thin', 'n=Inf');

但这会使图像变薄到1像素宽更改n的值不会产生所需的结果。有什么方法可以确保细化到n像素宽吗?

最佳答案

你可以先将角色变薄,然后通过形态学来人工扩展他们的骨骼。对于膨胀,morphological dilation最为合适。因此,使用标准细化算法对字符进行细化,然后使用大小合适的结构元素对结果进行放大。结构元素的大小应该决定细化结果的厚度。
为了进一步说明我的观点,下面是一个我在谷歌上找到的图片:
使用Matlab读取并转换为二进制:

im = im2bw(imread('https://lh3.ggpht.com/aWaaZ-BsAXSYyyHRlube_NkiB-Q-FDx-Wpgg8qi5jqrNvAvNp87amEwSUNr7PdbCizY=w300'));

这就是我们得到的:
进行稀释可以:
thinned = bwmorph(im, 'thin', 'n=Inf');

如果要增加细化结果的厚度,使其厚度小于cc>像素,请使用大小小于cc>的基本方形结构元素,并将其与对二值图像执行形态扩张的n函数一起使用。一般来说,要增加文本的厚度使其总厚度为n x n像素,可以选择正方形结构元素的大小为imdilate
下面是一些我在上面讨论过的例子。
n
这将使细化的宽度增加到2像素:
se = strel('square', 2);
expand = imdilate(thinned, se);
imshow(expand);

函数n定义了不同的结构元素,但我们将通过n = 2标志选择正方形。放大上面看到的细化图像,我们得到:
strel
只需将结构元素的大小更改为5 x 5,我们就可以得到:
se = strel('square', 5);
expand = imdilate(thinned, se);
imshow(expand);

如果您获取任何结果并放大文本,您将看到每个笔划的宽度实际上是2或5像素。然而,上述代码的假设是,每个字符足够分开,以允许保持每个笔划的可变厚度如果字符非常接近,则展开将这些文本字符合并在一起…但是细化算法很可能会在膨胀之前给你带来坏的结果。

关于algorithm - 对细化算法有更多控制权?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31386139/

10-10 16:13