2016-09-21 4 views
1

私はカード認識マシンを構築しようとしています。事は、カードがシナリオの上に置かれることです。画像の新しいオブジェクトを取得する

私は画像と比較するにはどのように役立つと言われていますが、空の背景(cenario)ともう1つは同じシーナリオで、その上にカードがあります。

import numpy as np 
from PIL import Image 
import cv2 

image1 = cv2.imread("gray_bk.png") 
image2 = cv2.imread("gray_novo.png") 

cv2.imwrite('LutGrey.png',gray_image) 

novo = cv2.subtract(image1,image2) 
cv2.imwrite(file, novo) 

これはこれまでのところ、それに伴う問題は、リターンは私が実行しないか、その中のカード(OK)と黒のイメージですが、カードの色が全て台無しにされていることである私のコードです色をつぶすことなく同じ操作ですか?そして、カードを新しい(より小さな)画像に「カット」するための最良の方法は何でしょうか。

+0

は、同様の画像を提供します。画像を持たずに誰もが画像関連の質問に答えることは難しいです。 – saurabheights

+0

@saurabheights画像リンクpostimg.org/image/dz72s444t/ – Clash

+0

最初に、背景画像と最終出力を提供する必要があります。次に、減算、http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#subtractを使用しています。このメソッドはdiffを実行し、イメージを飽和させ、色の歪みを引き起こします。歪みは彩度のためだけではなく、黒以外の画像でdiffを行っているためです。色(色相)は、R、G、およびBの色の比率に関連しているため、R、G、およびBを非ゼロの値から減算すると、比率はオフになります。 – saurabheights

答えて

0

あなたは本当の画像を使用している場合、私は次のことをお勧め:

  • 読み取りカラー画像
  • いくつかの初期presmoothingを行う
  • substractグレースケール画像およびしきい値結果
  • は、必要に応じて、いくつかの形態学を行います閉じる
  • しきい値付き画像の最大の領域をラベル付きで表示します
  • get the bouカード領域の長方形(例えば、cvのboundingRect)を指定し、元のカラー画像からこの領域を抽出する。¶

代替手段は、一般に、特徴検出に基づいてより堅牢なアプローチである。初心者のためにこれをチェックしてください: http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.htmlこの場合、可能なカード候補はすべて事前に知っていなければなりません。

カードはちょうどこれがうまくいくかもしれないよりも、背景画像に重ねた場合:

# read directly to float 
image1 = cv2.imread("gray_bk.png").astype(np.float)/255 
image2 = cv2.imread("gray_novo.png").astype(np.float)/255 

# substract and threshold 
threshold = 0.1 
binary_image = np.abs(np.mean(image2,2) - np.mean(image1,2)) > threshold 
# get card area 
y,x = np.where(binary_image) 
# extract card from the image 
card = image2[ y.min():y.max(), x.min():x.max(),:] 
+0

あなたの答えをありがとう、私はこの分野で本当に新しいです、私の目標は、http://postimg.org/image/dz72s444t/のようなイメージを与えることです赤いカードだけを含む新しいイメージを作成する(私はそれを認識に送る)。色は常に同じではないので、私はバックグラウンドから差し引く必要があります。どんなコードでも多くの助けになるでしょう。ありがとうございました – Clash

関連する問題