对细化算法有更多的控制?
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 个像素。但是,上述代码的假设是每个字符都充分分开,以允许保持每个笔划的可变粗细。如果字符靠得很近,那么扩张会将这些文本字符合并在一起……但是即使在扩张之前,细化算法也很可能会给你带来不好的结果。
我有一些文本文档,我想将其中的文本变细为不同的宽度,例如 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 个像素。但是,上述代码的假设是每个字符都充分分开,以允许保持每个笔划的可变粗细。如果字符靠得很近,那么扩张会将这些文本字符合并在一起……但是即使在扩张之前,细化算法也很可能会给你带来不好的结果。