Python 如何知道在找到阈值后是否需要反转阈值类型

Python 如何知道在找到阈值后是否需要反转阈值类型,python,opencv,opencv-contour,image-thresholding,Python,Opencv,Opencv Contour,Image Thresholding,我正在使用OpenCV进行手部检测。但当我试图描绘被打谷的图像轮廓时,我很挣扎查找轮廓将始终尝试查找白色区域作为轮廓 基本上,它在大多数情况下都能工作,但有时我的脱粒图像如下所示: \u,threshed=cv2.阈值(灰色,127,255,cv2.THRESH\u二进制| cv2.THRESH\u大津) 因此,要使其工作,我只需要更改阈值类型cv2.THRESH\u BINARY\u INV \u,threshed=cv2.阈值(灰色,127,255,cv2.THRESH_BINARY_IN

我正在使用OpenCV进行手部检测。但当我试图描绘被打谷的图像轮廓时,我很挣扎<代码>查找轮廓将始终尝试查找白色区域作为轮廓

基本上,它在大多数情况下都能工作,但有时我的脱粒图像如下所示:

\u,threshed=cv2.阈值(灰色,127,255,cv2.THRESH\u二进制| cv2.THRESH\u大津)

因此,要使其工作,我只需要更改阈值类型
cv2.THRESH\u BINARY\u INV

\u,threshed=cv2.阈值(灰色,127,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

而且效果很好

我的问题是如何确定何时需要反转阈值?我是否需要始终在两个阈值图像上找到轮廓,并比较结果(在这种情况下如何?)?或者有一种方法可以消除轮廓线是否完全丢失的问题。

编辑:有一种方法可以100%确保轮廓看起来像一只手

编辑2:所以我忘了提到我正试图用它来检测指尖和缺陷,所以我需要缺陷,第一张经过阈值处理的图像我找不到缺陷,因为它是反向的。请参见第一个轮廓上的蓝色点


谢谢。

您可以编写一个实用方法来检测沿边框的最主要颜色,然后确定逻辑,就像您是否要反转图像一样,因此流程可能如下所示:

  • 使用OSTU二值化方法
  • 将阈值图像传递到实用方法
    获取最主要的边界颜色
    并获取主要颜色
  • 如果边框颜色为白色,则应使用
    cv2.bitwise\u not
    反转图像,否则仅保持该方式
  • get\u most\u primary\u border\u color
    可定义为:

    from collections import Counter
    
    def get_most_dominant_border_color(img):
        # Get the top row
        row_1 = img[0, :]
        # Get the left-most column
        col_1 = img[:, 0]
        # Get the bottom row
        row_2 = img[-1, :]
        # Get the right-most column
        col_2 = img[:, -1]
    
        combined_li = row_1.tolist() + row_2.tolist() + col_1.tolist() + col_2.tolist()
    
        color_counter = Counter(combined_li)
    
        return max(color_counter.keys(), key=lambda x:color_counter.values())
    

    您可以编写一个实用方法,沿边框检测最主要的颜色,然后确定逻辑,就像您是否要反转图像一样,因此流程可能如下所示:

  • 使用OSTU二值化方法
  • 将阈值图像传递到实用方法
    获取最主要的边界颜色
    并获取主要颜色
  • 如果边框颜色为白色,则应使用
    cv2.bitwise\u not
    反转图像,否则仅保持该方式
  • get\u most\u primary\u border\u color
    可定义为:

    from collections import Counter
    
    def get_most_dominant_border_color(img):
        # Get the top row
        row_1 = img[0, :]
        # Get the left-most column
        col_1 = img[:, 0]
        # Get the bottom row
        row_2 = img[-1, :]
        # Get the right-most column
        col_2 = img[:, -1]
    
        combined_li = row_1.tolist() + row_2.tolist() + col_1.tolist() + col_2.tolist()
    
        color_counter = Counter(combined_li)
    
        return max(color_counter.keys(), key=lambda x:color_counter.values())
    

    findContours在反转的二值图像上也会起同样的作用,所以如果你只需要轮廓,你不需要担心它。好吧,我的错,我忘了一些信息,我会编辑这个问题。就在这里,我需要检测缺陷点。findContours在反转的二值图像上也会起同样的作用,所以如果你只需要轮廓,你不需要担心它。好吧,我的错,我忘记了一些信息,我会编辑这个问题。就在这里,我需要检测缺陷点。好的,我理解算法,但我得到一个
    类型错误:'>'在'dict_values'和'dict_values'实例之间不受支持。
    这一行的异常:
    返回最大值(color_counter.keys(),key=lambda x:color_counter.values())
    。你能解释一下它的作用吗?主要是
    键:lambda部分
    ?您使用的是哪种Python版本?python3.7.3,我找到了问题所在,目前正在尝试解决它。当我打印
    color\u counter.keys()
    时,它返回
    dict\u keys([255,0])
    而不是
    [255,0]
    。因此,为了避免此错误,我将键转换为list,它可以工作。键:
    colors\u KEYS=list(color\u counter.KEYS())
    --值:
    colors\u VALUES=list(color\u counter.VALUES())
    --最大值:
    主色=MAX(colors\u键,key=lambda x:colors\u值)
    好的,我理解算法,但是我得到了一个
    TypeError:“>”在“dict\u values”和“dict\u values”的实例之间不受支持
    这一行的异常:
    返回max(color\u counter.keys(),key=lambda x:color\u counter.values())
    。你能解释一下它的作用吗?主要是
    键:lambda部分
    ?您使用的是哪种Python版本?python3.7.3,我找到了问题所在,目前正在尝试解决它。当我打印
    color\u counter.keys()
    时,它返回
    dict\u keys([255,0])
    而不是
    [255,0]
    。因此,为了避免此错误,我将键转换为list,它可以工作。键:
    colors\u KEYS=list(color\u counter.KEYS())
    --值:
    colors\u VALUES=list(color\u counter.VALUES())
    --最大值:
    primary\u color=MAX(colors\u键,key=lambda x:colors\u值)