如果我有一个图像,让我们说方块。是否有可能去除由10个(非白色)像素或更少形成的所有形状,并保留由11个像素或更多像素形成的所有形状?我想以编程方式或通过命令行来执行此操作。从X像素或更少的像素中删除图像的形状
在此先感谢!
如果我有一个图像,让我们说方块。是否有可能去除由10个(非白色)像素或更少形成的所有形状,并保留由11个像素或更多像素形成的所有形状?我想以编程方式或通过命令行来执行此操作。从X像素或更少的像素中删除图像的形状
在此先感谢!
有几种方法可以解决这个问题。你所说的通常称为文件成像应用程序中的去斑。文档扫描仪在扫描过程中经常会在图像中引入大量灰尘和噪音,因此必须将其删除以帮助提高OCR的准确性。
我假设您在这里处理黑白图像,或者可以将图像转换为黑白图像,否则它会变得复杂得多。去斑点是通过分析页面上的所有斑点来完成的。另一种决定斑点大小的方法是决定宽度,高度和像素数量的组合。
Leptonica.com - 是一个基于开放源码C的库,具有您需要的blob分析功能。通过一些简单的检查和循环,您可以删除这些较小的对象。 Leptonica也可以很容易地编译成命令行程序。有很多示例程序,这是学习Leptionica的最佳方式。
对于测试,您可能要尝试ImageMagick。它有一个despeckle命令行选项,但没有其他参数。 http://www.imagemagick.org/script/command-line-options.php#despeckle
另一种选择是在Google中寻找“去斑”算法。
查找洪水填充算法并改变它们来计算像素而不是填充。然后如果形状足够小,请用白色填充。
您需要连接组件标签算法。它将扫描图像并为每个连接的形状提供一个id号,并为每个像素分配一个它所属形状的id号。
运行连接组件过滤器后,只计算分配给每个对象的像素,找到具有少于10个像素的对象,并用白色替换这些对象中的像素。
可能一种称为侵蚀的算法可能是有用的。它适用于布尔图像,缩小“true”的所有区域,去除其表面像素的一层。适用几次,小面积消失,大面积剩余(虽然缩小)。用相反的算法缩小幸存者,扩张(对图像的逻辑补充施加侵蚀)。通过测试一个像素是否位于“对象”中,然后定义它,找到一种方法来定义布尔图像,并找到一种方法将结果应用于原始图像,以将不需要的小对象更改为背景颜色。
更具体的将需要看到的例子。
你只是想弄清楚每个组件的面积。所以一个8方向的跟踪算法可以提供帮助。我有一个API解决了用C++编写的这个问题。如果你想,给我发一封电子邮件。
如果你可以使用openCV,这段代码做你想要的(即despakle)。您可以在第一行播放大小(3,3)的参数,以摆脱更大或更小的噪音伪影。
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3));
morphologyEx(image, image, MORPH_OPEN, element);
morphologyEx(image, image, MORPH_CLOSE, element);
ImageMagick,从版本6.8开始。9-10,包括一个-connected-components
选项,可以用来做你想做的事情,但是从官方网站提供的example,如何真正获得原始图像减去删除的连接组件并不明显。
我几乎可以肯定有一个简单的方法,但我做到了通过笨重的脚本执行一系列步骤:
首先,我从所连接的部件例如运行命令:
convert in.png \
-define connected-components:verbose=true \
-connected-components 8 out.png
这产生以下格式输出:
Objects (id: bounding-box centroid area mean-color):
(...)
181: 9x9+1601+916 1605.2,920.2 44 gray(0)
185: 5x5+1266+923 1268.0,925.0 13 gray(0)
274: 5x5+2276+1661 2278.0,1663.0 13 gray(255)
然后,我使用awk仅过滤包含黑色分量(在图像中的平均颜色为gray(0)
)的区域(以像素为单位)的行小于我的阈值$ min_cc_area。请注意,connected-components
可以选择过滤小于给定区域的组件,但我需要相反的选项。在AWK线是类似于以下:
{if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }}
我随后就创建一个命令行为的ImageMagick其中I画了这些连接部件的顶部白色矩形。该-draw
命令期望形式x1,y1 x2,y2
坐标,所以我AWK再次用来计算从那些坐标由-connected-components
提供的格式[w]x[h]+x1+y1
:
awk '{print "white fill rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }'
最后,我跑了创建ImageMagick的命令行来创建一张新图像,将原始图像顶部的所有白色矩形组合在一起。
最终,我得到了下面的脚本:
# usage: $0 infile min_cc_area outfile
infile=$1
min_cc_area=$2
outfile=$3
awk_exp="{if (\$4 < $min_cc_area && \$5==\"gray(0)\") { print \$2 }}"
draw_rects=""
draw_rects+=$(convert $infile -define connected-components:verbose=true \
-connected-components 8 null: | \
awk "$awk_exp" | tr 'x+' ' ' | \
awk '{print " rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }')
convert $infile -draw "fill white $draw_rects" $outfile
注意,该解决方案可以消除接近黑色像素去除CC的,如果他们insersect已删除组件的边框。
侵蚀 - >膨胀周期是否无损? – 2010-12-13 19:43:14