2010-12-10 62 views
1

如果我有一个图像,让我们说方块。是否有可能去除由10个(非白色)像素或更少形成的所有形状,并保留由11个像素或更多像素形成的所有形状?我想以编程方式或通过命令行来执行此操作。从X像素或更少的像素中删除图像的形状

在此先感谢!

回答

2

有几种方法可以解决这个问题。你所说的通常称为文件成像应用程序中的去斑。文档扫描仪在扫描过程中经常会在图像中引入大量灰尘和噪音,因此必须将其删除以帮助提高OCR的准确性。

我假设您在这里处理黑白图像,或者可以将图像转换为黑白图像,否则它会变得复杂得多。去斑点是通过分析页面上的所有斑点来完成的。另一种决定斑点大小的方法是决定宽度,高度和像素数量的组合。

Leptonica.com - 是一个基于开放源码C的库,具有您需要的blob分析功能。通过一些简单的检查和循环,您可以删除这些较小的对象。 Leptonica也可以很容易地编译成命令行程序。有很多示例程序,这是学习Leptionica的最佳方式。

对于测试,您可能要尝试ImageMagick。它有一个despeckle命令行选项,但没有其他参数。 http://www.imagemagick.org/script/command-line-options.php#despeckle

另一种选择是在Google中寻找“去斑”算法。

3

查找洪水填充算法并改变它们来计算像素而不是填充。然后如果形状足够小,请用白色填充。

0

您需要连接组件标签算法。它将扫描图像并为每个连接的形状提供一个id号,并为每个像素分配一个它所属形状的id号。

运行连接组件过滤器后,只计算分配给每个对象的像素,找到具有少于10个像素的对象,并用白色替换这些对象中的像素。

3

可能一种称为侵蚀的算法可能是有用的。它适用于布尔图像,缩小“true”的所有区域,去除其表面像素的一层。适用几次,小面积消失,大面积剩余(虽然缩小)。用相反的算法缩小幸存者,扩张(对图像的逻辑补充施加侵蚀)。通过测试一个像素是否位于“对象”中,然后定义它,找到一种方法来定义布尔图像,并找到一种方法将结果应用于原始图像,以将不需要的小对象更改为背景颜色。

更具体的将需要看到的例子。

+0

侵蚀 - >膨胀周期是否无损? – 2010-12-13 19:43:14

0

你只是想弄清楚每个组件的面积。所以一个8方向的跟踪算法可以提供帮助。我有一个API解决了用C++编写的这个问题。如果你想,给我发一封电子邮件。

1

如果你可以使用openCV,这段代码做你想要的(即despakle)。您可以在第一行播放大小(3,3)的参数,以摆脱更大或更小的噪音伪影。

Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3)); 
morphologyEx(image, image, MORPH_OPEN, element); 
morphologyEx(image, image, MORPH_CLOSE, element); 
0

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已删除组件的边框。