更多地控制细化算法?

Stu*_*PhD 1 algorithm matlab image-processing

我有一些文本文档,我想将文本细化为不同的宽度,如2像素宽笔画,4像素宽等等.

我知道matlab已经有了稀疏算法,bwmorph并且可以通过使用来实现一个像素宽的细化

thinned = bwmorph(bw_image, 'thin', 'n=Inf');
Run Code Online (Sandbox Code Playgroud)

但是这会将图像缩小到1像素宽度.改变价值n不会产生预期的结果.有什么方法可以确保减薄到n像素宽度?

ray*_*ica 5

你总是可以先削减角色,然后通过执行形态来人为地扩展他们的骨骼.对于扩张,形态学扩张是最合适的.因此,使用标准细化算法使字符变细,然后在使用具有良好尺寸的合适结构元素之后扩展结果.结构元素的大小应该决定稀疏结果的厚度.

为了进一步举例说明我的观点,这里有一个我在Google上找到的图片示例:

用MATLAB读取并转换为二进制:

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

这就是我们得到的:

在此输入图像描述

执行细化为我们提供:

thinned = bwmorph(im, 'thin', 'n=Inf');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果要增加细化结果的厚度以使厚度为n像素,请使用带有大小的基本方形结构元素,n x n并将其与imdilate函数一起使用,该函数对二进制图像执行形态膨胀.通常,要增加文本的厚度以使像素的总厚度n,您可以选择方形结构元素的大小n.


以下是我上面讨论过的一些例子.

n = 2

这会将细化增加到2像素宽:

se = strel('square', 2);
expand = imdilate(thinned, se);
imshow(expand);
Run Code Online (Sandbox Code Playgroud)

该函数strel定义了不同的结构元素,但我们将选择square one via 'square'flag.将上面看到的变薄图像展开,我们得到:

在此输入图像描述

n = 5

只需将结构元素更改为5 x 5,我们就可以得到:

se = strel('square', 5);
expand = imdilate(thinned, se);
imshow(expand);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


如果您获取任何结果并放大文本,您将看到每个笔划的宽度确实是2或5像素.然而,上述代码的假设是每个字符被充分分开以允许保持每个笔划的可变厚度.如果角色非常接近,那么扩张会将这些文本字符合并在一起......但是细化算法很可能在扩张之前给你带来不好的结果.