【问题标题】:Opencv Make White Pixels brighter than other pixels in the image so that to be displayed after thresholdingOpencv使白色像素比图像中的其他像素更亮,以便在阈值处理后显示
【发布时间】:2021-01-23 05:21:45
【问题描述】:

我的这张图片有一条白线,我正在尝试使这条线更亮,以便在阈值处理后清晰显示,如预期的输出所示。但是,使用我的代码,它无法检测到该行。

我的代码:

img = mpimg.imread(filenm)

hsv_img = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

mask_white = cv2.inRange(img, (200,200,200), (255, 255, 255))
mask_yellow = cv2.inRange(hsv_img, (15,60,20), (25, 255, 255))
color_mask = cv2.bitwise_or(mask_white, mask_yellow)
mask_img[color_mask == 0] = [0,0,0]

# apply image thresholding
img = cv2.bitwise_and(mask_img[:,:,0], masked_img[:,:,0], mask=stencil)
ret, thresh = cv2.threshold(img, 130, 145, cv2.THRESH_BINARY)

# plot image
plt.figure(figsize=(10,10))
plt.imshow(thresh, cmap= "gray")

预期输出:

【问题讨论】:

    标签: opencv image-processing opencv3.0


    【解决方案1】:

    您可以使用HSV-Color-Picker 来查找inRange 方法的上下颜色输入。

    import cv2
    import numpy as np
    
    img = cv2.imread("NPmF8.jpg")
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lwr = np.array([16, 23, 129])
    upp = np.array([36, 43, 209])
    img_mask = cv2.inRange(hsv, lwr, upp)
    

    结果:

    然后你可以申请line-detector来检测线条:

    lines = cv2.ximgproc.createFastLineDetector().detect(img_mask)
    
    for ln in lines:
        x1 = int(ln[0][0])
        y1 = int(ln[0][1])
        x2 = int(ln[0][2])
        y2 = int(ln[0][3])
        cv2.line(img,
                 pt1=(x1, y1),
                 pt2=(x2, y2),
                 color=(0, 255, 0),
                 thickness=3)
    

    结果:

    【讨论】:

    • 使用 Hough 变换检测线条与 line-detector 有什么区别吗?
    • 我只是想举例说明如何使用它。您也可以使用霍夫变换。根据我过去的经验,霍夫变换的性能比line-detector 差。因此我以line-detector 为例。
    • 我有多个不同光照条件下的帧。 hsv 不是恒定的。我应该如何找到所有这些帧的 hsv?
    • 然后你需要从照片中移除闪电效果。检查my answer,它结合了gaussianBlurdivide 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多