画像領域の数を数える


8

あなたの目標は、5つの正の整数と画像ファイル名を含む文字列を[X1,Y1], [X2,Y2], N, image.jpg適切な形式で入力として受け取る完全なプログラムまたは関数を記述することです。ここで、

  • 最初のカップル[X1,Y1]は、左上のX、サンプル画像()の青い長方形領域のY座標(<=20)です16,11
  • 第二のカップルが[X2,Y2]右下ありXY座標(<=20例えば、画像内の青い矩形領域の)( 20,22)。
  • Nそのような5番目の数0 <= N <= 9は、見つけなければならない数です。
  • 6番目のパラメータは、このJPG画像のファイル名を含む文字列です。

N指定された領域に存在するの数を出力します(この例では、図で青で囲まれています)。

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

同じ画像のより大きなクリーンバージョンを取得するには、ここをクリックしてください

画像内から500個の番号がある09(含まれる)等幅で、25行当たり20 columnnsに配置されCourier Newたフォント。それぞれの数字は異なる色を持っています(この事実を利用するか、それを無視して、イメージがモノクロームであるかを検討または変換することができます)。

テストケース:

[4,4],[13,5],1,image.jpg    > 4  (outlined in red)
[4,4],[13,5],4,image.jpg    > 2  (outlined in red)
[17,5],[17,5],2,image.jpg   > 1  (outlined in magenta)
[17,5],[17,5],9,image.jpg   > 0  (outlined in magenta)
[20,8],[20,9],3,image.jpg   > 1  (outlined in cyan)
[20,8],[20,9],2,image.jpg   > 0  (outlined in cyan)
[16,11],[20,22],0,image.jpg > 8  (outlined in blue)
[16,11],[20,22],3,image.jpg > 9  (outlined in blue)
[3,14],[11,20],7,image.jpg  > 6  (outlined in green)
[3,14],[11,20],5,image.jpg  > 6  (outlined in green)
[3,14],[11,20],8,image.jpg  > 8  (outlined in green)
[1,1],[20,25],0,image.jpg   > 47 (whole picture)
[1,1],[20,25],8,image.jpg   > 50 (whole picture)
[1,1],[20,25],1,image.jpg   > 55 (whole picture)

ルール:

  • これはので、最短のコードが優先されます。
  • このJPGファイルを入力として受け取る必要があります
  • JPGで表される数値のマトリックスまたは結果をハードコードすることはできません。
  • 標準の抜け穴は禁止されています。

回答:


4

Mathematica、92バイト

Count[Take[Characters@StringSplit@TextRecognize@Binarize[Import@#4,.9],#2,#],ToString@#3,2]&

この形式で引数を取る名前のない関数:[{X1,X2}, {Y1,Y2}, N, "image.jpg"]。(実際、4番目の引数は、ローカルファイル名またはURLのいずれかhttp://i67.tinypic.com/6qh5lj.jpgです。)

Import@#4画像ファイルをインポートし、Binarize[...,.9]すべての数値を黒に暗くし、TextRecognize(ここでは明らかに重い関数を実行している関数です!)結果の画像から複数行の文字列を抽出し、で文字のネストされたリストに分割しCharacters@ます。

Take[...,#2,#]輪郭が描かれた長方形に対応する文字のみを保持し、結果ののCount[...,ToString@#3,2]出現回数をカウントしNます。


2

Python 3 +枕+ pytesseract、239バイト

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split()[i//w+a[1]-1][i%w+a[0]-1]==str(n)])

これは、各数値タイルについて、ファイル全体が解析されるため、ひどく非効率的です。はるかに速く、わずかに長い243バイトのソリューションは、

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):s=image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split();w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if s[i//w+a[1]-1][i%w+a[0]-1]==str(n)])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.