この写真にはいくつの形がありますか?


10

子供はオブジェクトを分類して数えるのがとても上手です。コンピュータはもっと問題があるようです。これは、この問題の簡略版です。画像内のオブジェクトを分類およびカウントできる小さなプログラムを作成できますか?

問題:1つ以上の円と四角形を含む画像が与えられた場合、円の数と四角形の数を含む2つの整数を返します。

ルール

  • 入力画像は、選択したビットマップ形式の白い背景に黒い数字になります。
  • 画像の幅と高さは100〜1000ピクセルです。
  • 図は画像内に完全に含まれます。
  • 図の線幅は1ピクセルです。
  • 画像はアンチエイリアスを使用しません。白のみに黒になります。
  • 図形は、接触したり、交差したり、別の図形の中にある場合があります。
  • 交差する図形には、最大4つの共通ピクセルがあります。
  • 円の直径は20ピクセル以上になります。
  • 長方形の辺の長さは10ピクセル以上になります。
  • 形状を認識する組み込み関数やライブラリ、またはこの課題を簡単にする他の関数を使用することはできません。
  • 円と長方形の数を含む2つの整数を返すか、出力します。

例1

例1

回答:3 4

例2:

ここに画像の説明を入力してください

正解:4 13

これはコードゴルフの挑戦なので、各言語で最短のプログラムまたは機能が勝ちます。


四角形を数えることは、角を数えることですが、円はもっと難しいでしょう。
バーリント

回答:


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;}

2つのテストケースで使用したURLはhttp://i.stack.imgur.com/qnIFk.png、およびhttp://i.stack.imgur.com/HV9k3.pngです。

水平線を数え、2で割って形状の数を取得します。円の水平セグメントが短く、長方形の水平セグメントが長いという観察に依存しています。

ハッキングは認められていますが、テストケース以外での動作は保証されていません。

画像を±45°回転させて、水平線を検出してみました。これは、対角線をチェックすることと同等で、円をより適切に取得しますが、処理するのに十分なエッジを残しておく補間アルゴリズムを見つけることができませんでした。たとえば、行を2行のピクセルに汚し、カウントを台無しにする可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.