【问题标题】:Select object by color in an image?在图像中按颜色选择对象?
【发布时间】:2017-07-08 02:30:01
【问题描述】:

有没有办法找到具有特定颜色的对象(例如红色矩形 100px 50px 和白色文本),然后按原样选择该对象并将其剪切到新文件?看看下面的图片。我正在尝试制作一个从图像中选择数据的脚本,然后转换为文本,最后写入 Excel。

我用谷歌搜索了很多方法,但没有找到任何解决我的问题的方法。

Sample image

【问题讨论】:

  • 有一个名为 OpenCV 的程序包(CV = 计算机视觉),它具有 Python 绑定,就选择对象而言,它可能会执行您想要的操作。
  • 将图像转换为 HSV 颜色空间 -> 提取红色轮廓区域 -> 对提取的红色轮廓内的区域执行 MSER -> Tesseract 将能够读取它们

标签: python image object image-processing colors


【解决方案1】:

我不知道你的真实意图,你是想只看文字还是要提取部分内容? 无论如何,我将向您展示一个直接且通用的解决方案。取你需要的零件,最后找到孔码。

你需要 4 个模块:
cv2 (openCV) 用于图像处理
numpy 用于处理图像上的特殊操作
pytesseract 用于识别文本(ocr)
pillow (pil) 为 pytesseract 准备图像

加载和过滤器

您的原图:

首先我们减少除红色以外的所有颜色。 lowerupper 描述了我们喜欢过滤的 BGR(RGB = 红、绿、蓝)的值。

image = cv.imread("AR87t.jpg")

lower = np.array([0, 0, 200])
upper = np.array([100, 100, 255])
shapeMask = cv.inRange(image, lower, upper)

cv.imshow("obj shapeMask", shapeMask)
cv.waitKey(0)

这表明:


寻找轮廓
接下来,我们找到轮廓并迭代。如果我们找到 4 个角,我们将做接下来的事情......

cnts = cv.findContours(shapeMask.copy(), cv.RETR_EXTERNAL,
                       cv.CHAIN_APPROX_SIMPLE)[0]

for c in cnts:
    peri = cv.arcLength(c, True)
    approx = cv.approxPolyDP(c, 0.04 * peri, True)
    if len(approx) == 4:
    ....



屏蔽原件
使用boundingRect,我们提取xywh

(x, y, w, h) = cv.boundingRect(approx)
cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5)




面具上的 ocr
魔法来了!首先,我们提取掩码部分并将 openCV 图像导出为 PIL 图像。然后我们就可以运行 tesseract。

el = shapeMask.copy()[y:y + h, x:x + w]
pil_im = Image.fromarray(el)

cv.imshow("obj", el)
cv.waitKey(0)

print(pytesseract.image_to_string(pil_im))


这会将每个矩形显示为小图像。您的控制台将打印出:

L2 = 33,33
L3 = 44,44
L1 = 12,22



代码

import cv2 as cv
import numpy as np
import pytesseract
from PIL import Image



image = cv.imread("AR87t.jpg")

lower = np.array([0, 0, 200])
upper = np.array([100, 100, 255])
shapeMask = cv.inRange(image, lower, upper)

cv.imshow("obj shapeMask", shapeMask)
cv.waitKey(0)


cnts = cv.findContours(shapeMask.copy(), cv.RETR_EXTERNAL,
                       cv.CHAIN_APPROX_SIMPLE)[0]

for c in cnts:
    peri = cv.arcLength(c, True)
    approx = cv.approxPolyDP(c, 0.04 * peri, True)
    if len(approx) == 4:
        (x, y, w, h) = cv.boundingRect(approx)
        cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5)

        print("w:%s, y:%s, w:%s, h:%s" % (x, y, w, h))

        el = shapeMask.copy()[y:y + h, x:x + w]
        pil_im = Image.fromarray(el)

        cv.imshow("obj", el)
        cv.waitKey(0)

        print(pytesseract.image_to_string(pil_im))


cv.imshow("obj rectangle", image)
cv.waitKey(0)

【讨论】:

    猜你喜欢
    • 2017-01-16
    • 2016-10-15
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多