【问题标题】:find contours in image where object and background have nearly same color在图像中找到对象和背景具有几乎相同颜色的轮廓
【发布时间】:2019-10-11 23:15:43
【问题描述】:

当图像和背景中的对象具有几乎相同的颜色时,如何有效地执行边缘检测? 我尝试使用下面的代码,但它没有给出我想要的:

import cv2
import matplotlib.pyplot as plt
image = cv2.imread("image1.JPG")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 17, 17)
edged = cv2.Canny(gray, 10, 150)
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)

plt.imshow(edged)
plt.show()

image1

edges1

【问题讨论】:

    标签: python opencv edge-detection opencv-contour


    【解决方案1】:

    您不应该使用COLOR_BGR2GRAY 将图像转换为灰度,否则会丢失颜色数据。您要做的是找到能够为您提供最佳边缘检测结果的色彩空间。您可以尝试 3 种颜色空间,其中一种可能适合您的应用程序:HSV、YCrCb 和 LAB。

    这是对 LAB 图像的第二个分量进行精确边缘检测的结果。

    lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
    a_component = lab[:,:,1]
    edged = cv2.Canny(a_component, 10, 50)
    

    【讨论】:

    • 他的想法是正确的。此外,还可以构建基于二色模型的最优分色变换函数
    • @fireant 谢谢,但我无法重现与您相同的结果!你错过了复制一些代码行吗?另外,我想检测整个打火机,而不仅仅是身体部位!
    • @MohammedGh 处理输入图像的只有3行,imgimread()返回的数组,然后edged传递给imwrite()得到上图左图。如果您尝试使用其他颜色通道来检测打火机的其他部分,您会看到有一个颜色通道非常适合。然后你可以结合这两个通道来获得打火机的边框。
    • 有没有办法自动选择适当的色彩空间(HSV、YCrCb 或 LAB。)?
    猜你喜欢
    • 2020-04-14
    • 2020-05-04
    • 2016-10-29
    • 2023-03-03
    • 2018-09-30
    • 1970-01-01
    • 2017-12-19
    • 2022-01-09
    • 2020-06-21
    相关资源
    最近更新 更多