2015-12-18 10 views
5

13カラフルなブロックの画像の情報をテキストに変換しようとしています。たとえば、ここで黄色と青のブロックの数とその順序を知る必要があります。Pythonを使用して2つの結合された配列の配列を整列する

"C:\ target.jpg"

"c:\target.jpg"

"C:\ blue.jpg"

"c:\blue.jpg"

"C:\ yellow.jpg"

"c:\yellow.jpg"

私の持っているもの次のとおりです。

import cv2 
import numpy as np 

img_rgb = cv2.imread("c:\\target.jpg") 
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) 
template = cv2.imread('c:\\blue.jpg',0) 
# template = cv2.imread('c:\\blue.jpg',0) 
w, h = template.shape[::-1] 

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) 
threshold = 0.99 
loc = np.where (res >= threshold) 

# if print loc 
# (array([ 3, 31, 59, 87, 115, 143, 171, 199, 227, 255, 283, 311, 339], dtype=int64), array([7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7], dtype=int64)) 


print str(loc[0] + loc[1]) 

私はそれらを個別に実行すると、それはこれらのような結果を与える:

[ 13 41 69 97 125 153 181 209 237 265 293 321 349] 

[ 10 38 66 94 122 150 178 206 234 262 290 318 346] 

さて、これらの各13個の数字ですが、私はどのように知りませんそれらを扱う。 "青、黄、青、黄、青、青、黄、黄、青、黄、青、黄、青、黄色の"

:私のようなテキストにそれらを有効にするにはどうすればよい

+0

入力イメージは常にそのような単純な固定スタックですか、複数列、ミスアライメント、回転などの他のパタ​​ーン? –

+0

@John Zwinck、コメントいただきありがとうございます。ブロックの形状は常に単純で同じです。 –

答えて

1

を行うだろう。ここだけ中央ダウンピクセルのストライプを読み取って、非常にシンプルなソリューションです:それは

from PIL import Image 
im = Image.open(filename) 

xMin, yMin, xMax, yMax = im.getbbox() 
x = (xMin + xMax)/2 

colors = [] 
oldColor = None 
for y in xrange(yMin, yMax): 
    r, g, b = im.getpixel((x, y)) 

    if r > 240 and g > 240 and b > 240: 
     newColor = 'white' 
    elif g > 150 and b > 150: 
     newColor = 'blue' 
    elif r > 150 and g > 150: 
     newColor = 'yellow' 
    else: 
     newColor = 'unknown' 

    if newColor != oldColor: 
     if newColor != 'white': 
      colors.append(newColor) 
     oldColor = newColor 

print colors 

プリント:

['blue', 'yellow', 'blue', 'yellow', 'blue', 'blue', 'yellow', 'yellow', 'blue', 'yellow', 'blue', 'yellow', 'blue'] 
+0

助けてくれてありがとう!できます!あなたの考え方は、中央のピクセルのストライプの色を得ることは良い天使です。私は他の類似した構造の写真にこの方法を適用しました。 –

1

文字列にそれらの番号から変換するには、いくつかの方法がありますが、私は

bl=[ 13, 41, 69, 97,125,153,181,209,237,265,293,321,349] 
yl=[ 10, 38, 66, 94,122,150,178,206,234,262,290,318,346] 
x=sorted(bl+yl) 
out=', '.join(['blue' if y in bl else 'yellow' for y in x]) 
print out 
+0

答えに感謝します。画像には13のカラーブロックがありますが、26の出力があり、シーケンスを反映していません。 –

+0

ああ、私はこの問題を誤解しています。「print loc」の出力が何であるか教えてください。また、なぜグレースケールに変換していますか?フルカラーで作業するほうが良いのではないでしょうか? –

+0

@MarkK、あなたの問題を見つけたと思いますが、私はOpenCvに問題があり、今すぐテストできません。あなたの代わりにこのコマンド 'res = cv2.matchTemplate(img_rgb、template、cv2.TM_CCOEFF_NORMED) matchTemplate、そして 'print loc' –

関連する問題