在图像中获取新对象

时间:2016-09-21 21:23:52

标签: python opencv

我正在尝试建立一个卡片识别机器。事情就是这些卡片将被放在一个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)但是卡片中的颜色都搞砸了,我怎么执行相同的操作而没有弄乱了颜色?什么是最好的方式来削减"将卡片变成新的(较小的)图像。

1 个答案:

答案 0 :(得分:0)

如果您正在使用真实图像,我建议如下:

  • 阅读彩色图片
  • 做一些初步的前奏
  • 减去灰度图像并将结果阈值
  • 可选择进行一些形态学关闭
  • 使用标记
  • 找到阈值图像上的最大区域
  • 获取卡片区域的边界矩形(例如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(),:]