在图像中按颜色选择对象?

时间:2017-02-18 15:20:20

标签: python image object image-processing colors

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

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

Sample image

1 个答案:

答案 0 :(得分:7)

我不知道你的真实意图,你想只阅读文字还是你喜欢也提取部分? 无论如何,我将向您展示一个直接和一般的解决方案。拿到你需要的零件,最后找到钻孔代码。

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

加载和过滤

你的原始形象:
original

首先,我们减少除红色以外的所有颜色。 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)

这表明:
shape mask

找到轮廓
接下来,我们找到轮廓并迭代。如果我们找到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)


mask

面具上的 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)