对细化算法有更多的控制?

Having more control over the thinning algorithm?

我有一些文本文档,我想将其中的文本变细为不同的宽度,例如 2 像素宽的笔画、4 像素宽等。

我知道 matlab 在 bwmorph 中已经有了细化算法,使用

可以达到一个像素宽的细化
thinned = bwmorph(bw_image, 'thin', 'n=Inf');

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

你总是可以先瘦字,然后通过形态学人为地扩大他们的骨架。对于扩展,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 函数,它对二值图像执行形态学膨胀。一般来说,要增加文本的粗细度,使 整体 粗细度达到 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 个像素。但是,上述代码的假设是每个字符都充分分开,以允许保持每个笔划的可变粗细。如果字符靠得很近,那么扩张会将这些文本字符合并在一起……但是即使在扩张之前,细化算法也很可能会给你带来不好的结果。