这幅图中有多少个形状?


10

孩子们非常擅长对物体进行分类和计数。电脑似乎有更多麻烦。这是此问题的简化版本。您可以编写一个可以对图像中的对象进行分类和计数的小程序吗?

问题:给定一张图像包含一个或多个圆形和矩形,则返回2个整数,其中包含圆形和矩形的数量。

规则

  • 输入图像将是您选择的任何位图格式的白色背景上的黑色图形。
  • 图像的宽度和高度将在100到1000像素之间。
  • 图形将完全包含在图像中。
  • 数字将具有1像素的线宽。
  • 图像将不使用抗锯齿功能。它们只会是白色的黑色。
  • 人物可能会接触,相交或在另一个人物内部。
  • 相交的图形最多具有4个公共像素。
  • 圆的直径为20像素或更大。
  • 矩形边的长度将为10个或更多像素。
  • 您不得使用任何可识别形状的内置程序或库,也不得使用任何其他使此挑战变得微不足道的功能。
  • 返回或打印2个带有圆形和矩形计数的整数。

例子1

例子1

答案:3 4

范例2:

在此处输入图片说明

答案:4 13

这是一场代码挑战赛,因此每种语言中最短的程序或功能将获胜。


我已经知道,计算矩形将要计算角点,但是圆形会困难得多。
巴林特

Answers:


3

PHP – 355字节

字节数不包含'<image-url>'

<?php
m('<image-url>');function m($f){$i=imagecreatefrompng($f);$r=f($i,17);$c=f($i,9);echo($c-$r).' '.$r."\n";}function f($i,$k){$w=imagesx($i);$h=imagesy($i);$r=0;for($y=0;$y<$h;$y++)for($x=0;$x<$w;$x++)if(!imagecolorat($i,$x,$y))$r+=g($i,$x,$y,$w,$k);return$r;}function g($i,&$x,$y,$w,$k){$l=$x;while(!imagecolorat($i,$x,$y)&&$x<$w)$x++;return($x-$l>$k)?1/2:0;}

在这两个测试用例中,我使用的URL是http://i.stack.imgur.com/qnIFk.pnghttp://i.stack.imgur.com/HV9k3.png

计算水平线并除以2得到形状的数量。依赖于以下观察:圆形的水平线段较短,而矩形的水平线段较长。

公认的骇客,除测试用例外,不能保证能正常工作!

我尝试将图像旋转±45°并检测水平线。这将等效于检查对角线并更好地拾取圆,但是我找不到能使边缘清洁得足够干净的插值算法。例如,他们可能将一条线弄脏成两行像素并弄乱了计数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.