在轮廓 opencv 上找到主色

我试图在轮廓(黑色或白色)内找到主色。我正在使用 OpenCV 读取图像并在黑色图像上提取白色。这是我到目前为止得到的:

http://img4.mukewang.com/60f7c6b60001721d06810421.jpg

绿色轮廓是轮廓,蓝色线条是边界框。所以我在这个例子中我试图提取数字 87575220 但正如你所看到的,它也识别出一些随机伪像,例如字母 G。我认为解决方案是在轮廓内找到主色,这种颜色应该是接近白色。我不知道如何做到这一点。


这是我目前拥有的代码:


import argparse

import cv2

import imutils

import numpy as np


parser = argparse.ArgumentParser()

parser.add_argument("--image", "-i", required=True, help="Image to detect blobs from")

args = vars(parser.parse_args())


image = cv2.imread(args["image"])

image = imutils.resize(image, width=1200)

grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(grey)

maxval_10 = maxVal * 0.5

ret, threshold = cv2.threshold(grey, maxval_10, 255, cv2.THRESH_BINARY)

canny = cv2.Canny(grey, 200, 250)

lines = cv2.HoughLines(canny, 1, np.pi / 180, 140)


print(maxVal)


theta_min = 60 * np.pi / 180.

theta_max = 120 * np.pi / 180.0

theta_avr = 0

theta_deg = 0

filteredLines = []

for rho, theta in lines[0]:

    a = np.cos(theta)

    b = np.sin(theta)

    x0 = a * rho

    y0 = b * rho

    x1 = int(x0 + 1000 * (-b))

    y1 = int(y0 + 1000 * (a))

    x2 = int(x0 - 1000 * (-b))

    y2 = int(y0 - 1000 * (a))


    cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)


    if theta_min <= theta <= theta_max:

        filteredLines.append(theta)

        theta_avr += theta


if len(filteredLines) > 0:

    theta_avr /= len(filteredLines)

    theta_deg = (theta_avr / np.pi * 180) - 90

else:

    print("Failed to detect skew")


image = imutils.rotate(image, theta_deg)

canny = imutils.rotate(canny, theta_deg)


im2, contours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# cv2.drawContours(image, contours, -1, (0, 255, 0), 1)

cv2.imshow('Contours', im2)


boundingBoxes = []

filteredContours = []


for cnt in contours:

    (x, y, w, h) = cv2.boundingRect(cnt)

    if (h > 20 and h < 90 and w > 5 and w < h):

        if cv2.contourArea(cnt, True) <= 0:

            boundingBoxes.append((x, y, w, h))

            filteredContours.append(cnt)



幕布斯6054654
浏览 194回答 3
3回答

HUH函数

您可以从每个轮廓创建一个蒙版:mask = np.zeros(image.shape, dtype="uint8")cv2.drawContours(mask, [cnt], -1, 255, -1)然后计算掩码内所有像素的平均值:mean = cv2.mean(image, mask=mask)然后检查是否mean足够接近白色

慕容森

由于颜色空间属性,颜色和均值不能很好地匹配。我会创建一个直方图并选择最常见的一个(也可以应用一些颜色下采样)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python