【问题标题】:Detecting line by color using Opencv in python在python中使用Opencv按颜色检测线
【发布时间】:2017-02-10 07:04:06
【问题描述】:

我有一张图片(基本 X-Y 绘图图像,其中绘图线为蓝色,x,y 轴为黑色),其中我需要根据颜色检测边缘。我遇到了下面的代码,它通过使用精明的边缘检测和霍夫算法来检测所有的行。但我只需要检测此图像中的蓝色线。我该怎么做才能检测到这一点?

下面是我使用的代码。

import numpy as np
import cv2

img = cv2.imread('xyplot.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('grayimage',gray)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imshow('edgesimage',edges)
print img.shape[1]
print img.shape
minLineLength=img.shape[1]-300
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500,    
    threshold=10,lines=np.array([]),                                 
    minLineLength=minLineLength, maxLineGap=100)
a,b,c = lines.shape

for i in range(a):
    cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2],
        lines[i][0]   [3]), (0, 0, 255), 3, cv2.LINE_AA)

cv2.imshow('edges', edges)
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

    在转换为灰度之前在您的图像上应用(蓝色)颜色蒙版。您可以通过定义所有 3 个通道的上下边界并对原始图像执行 BITWISE_AND 来实现。您将不得不使用通道范围的值来确保只捕获您想要捕获的像素。

    lower = np.array([200, 20, 20], dtype = "uint8")
    upper = np.array([255, 100, 100], dtype = "uint8")
    mask = cv2.inRange(img, lower, upper)
    img = cv2.bitwise_and(img, img, mask = mask)
    

    注意:列表中的三个通道分别为 B、G 和 R。

    【讨论】:

    • 在行后使用我的 sn-p:img = cv2.imread('xyplot.png')
    • 由于在您的情况下图像是计算机生成的,您可以将颜色范围设置为接近 蓝色。
    • 我把它屏蔽了,但只有一半的行被屏蔽了。没有充分。如何让它完全被掩盖?
    • 您使用的下限值和上限值是多少?尝试使用这些值,使其覆盖更大范围的蓝色阴影
    • 我使用了与上图相同的值
    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 2021-12-25
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多