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

Rom*_*azi 5 python image colors image-processing object

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

我搜索了很多howtos,但没有发现任何解决我的问题.

样本图片

ove*_*ity 9

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

对于孔洞,您需要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)
Run Code Online (Sandbox Code Playgroud)

由此可见:
形状面具

找到轮廓
接下来,我们找到轮廓并迭代.如果我们找到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:
    ....
Run Code Online (Sandbox Code Playgroud)



掩盖了原来
有了boundingRect,我们提取x,y,w,h

(x, y, w, h) = cv.boundingRect(approx)
cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5)
Run Code Online (Sandbox Code Playgroud)


面具

面具上的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))
Run Code Online (Sandbox Code Playgroud)


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

L2 = 33,33
L3 = 44,44
L1 = 12,22
Run Code Online (Sandbox Code Playgroud)




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)
Run Code Online (Sandbox Code Playgroud)