2016-09-21 80 views
1

我正在嘗試構建識別卡的機器。事情是卡將放在一個cenario的頂部。在圖像中獲取新對象

這就是說我來幫助我怎麼可以比較圖像,一個是空的背景(cenario),另一個是與它上面的卡相同的cenario。

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然後使圖像飽和,這會導致顏色失真。注意失真不僅僅是因爲飽和,而且還因爲你正在做一個非黑色圖像的差異。因爲顏色(色相)與R,G和B顏色的比率更相關,所以如果從非零值中減去R,G和B,比率將消失。 – saurabheights

回答

0

如果與真實圖像的工作,我建議如下:

  • 讀出的彩色圖像
  • 做一些初步的presmoothing
  • 。減去灰度圖像和閾值結果
  • 可選擇做一些形態關閉
  • 找到帶標籤的閾值圖像上的最大區域
  • 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