从X像素或更少像素的图像中删除形状

时间:2010-12-10 12:52:20

标签: image-processing image-manipulation

如果我有图像,让我们说正方形。是否可以删除由10(非白色)像素或更少像素形成的所有形状,并保留由11像素或更多像素组成的所有形状?我想以编程方式或使用命令行执行此操作。

提前致谢!

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

可能称为侵蚀的算法可能很有用。它适用于布尔图像,缩小所有“真实”区域,去除其表面像素的一层。应用几次,小区域消失,较大区域保留(虽然收缩)。使用相反的算法,扩张(将侵蚀应用于图像的逻辑补充)来对幸存者进行缩小。找到一种方法来定义布尔图像,方法是测试像素是否在“对象”内,但是您定义它,并找到将结果应用于原始图像以将不需要的小对象更改为背景颜色的方法。

更具体地说,需要看一些例子。

答案 2 :(得分:2)

有几种方法可以解决这个问题。您所指的是文档成像应用程序中通常称为Despeckle。文档扫描仪在扫描过程中经常会在图像中引入大量污垢和噪声,因此必须将其移除以帮助提高OCR精度。

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

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

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

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

答案 3 :(得分: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);

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您只想弄清楚每个组件的面积。因此,8方向跟踪算法可以提供帮助。我有一个API解决这个用C ++编码的问题。如果您愿意,请给我发电子邮件。

答案 6 :(得分: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仅过滤包含小于我的阈值$ min_cc_area的黑色组件(图像中的平均颜色gray(0))的区域(以像素为单位)的线条。请注意,connected-components可以选择过滤小于给定区域的组件,但我需要相反。 awk行类似于以下内容:

    {if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }}
    
  • 然后我继续为ImageMagick创建一个命令行,我在这些连接组件的顶部绘制了白色矩形。 -draw命令需要x1,y1 x2,y2形式的坐标,因此我再次使用awk来计算[w]x[h]+x1+y1给出的-connected-components格式的坐标:

    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附近的黑色像素,如果它们对已移除的组件的边界矩形进行了不安全。