python - 在图像中获取新对象

标签 python opencv

我正在尝试构建一个卡片识别机。问题是卡片将放在场景之上。

话虽这么说,我是来寻求帮助的,我如何与图像进行比较,一个是空背景(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/

相关文章:

c++ - 有没有更好的方法来命名管道 `cv::mat` 变量

python - 如何设置注释框的 z-index (matplotlib)

python - 删除列表python中以特定事物开头的后面的字符串

python - Sqlalchemy 在尝试连接到 clickhouse 数据库时显示 "Code 516 Authentication failed"

python - 带有生成器表达式的 asyncio.gather

c++ - 为 cv::Mat 设置深度

python - 嵌套 IF/ELSE 和 ELIF 之间的区别?

python - 如何每秒自动将视频帧的特定区域提取到图像文件中

c++ - 删除面积 < n OpenCV 的边界矩形

java.lang.UnsatisfiedLinkError : Native method not found 错误