我正在尝试构建一个卡片识别机。问题是卡片将放在场景之上。
话虽这么说,我是来寻求帮助的,我如何与图像进行比较,一个是空背景(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)
到目前为止,这是我的代码,它的问题是,返回的是一张黑色图像,里面有卡片(好)但是卡片中的颜色都乱七八糟,我如何在没有的情况下执行相同的操作弄乱颜色?将卡片“剪切”成新的(较小的)图像的最佳方式是什么。
最佳答案
如果您使用的是真实图像,我建议如下:
- 阅读彩色图片
- 做一些初步的平滑处理
- 减去灰度图像并对结果进行阈值处理
- 可选地做一些形态学上的闭包
- 在带标签的阈值图像上找到最大区域
- 获取卡片区域的边界矩形(例如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(),:]
关于python - 在图像中获取新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39626806/