【问题标题】:Understanding cv2.threshold() function了解 cv2.threshold() 函数
【发布时间】:2015-02-25 15:33:23
【问题描述】:

我运行这段代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

im=cv2.imread('1.jpg')
#mask=np.zeros(img.shape[:2],np.uint8)
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh=cv2.threshold(imgray,200,200,200)
countours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(im,countours,-1,(0,255,0),3)
cv2.imshow("begueradj",im)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这2张图片上(我展示的是原图和结果图):

图一:

图二:

结果 1:

结果 2:

我的问题:

结果 1 中,threshold() 达到了我的预期。

但是为什么在 Result 2 中有那个绿色方块?根据我对threshold()函数的理解,只能显示绿色圆圈。为什么是这样 ?我对这个功能有什么不明白的地方?

【问题讨论】:

    标签: python python-2.7 opencv threshold


    【解决方案1】:

    OpenCV 将所有白色像素视为前景,将黑色像素视为背景。绿色轮廓可视化检测到的前景。

    如果您希望突出显示黑色圆圈,则需要事先反转图像。或者,您可以使用阈值类型“THRESH_BINARY_INV”(http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#threshold)。

    【讨论】:

    • 谢谢。所以你的意思是我有2个绿色边界,因为它们包裹了图片中的空白?是这个意思吗?
    • @Kabyle:没错。这就是我的意思。
    • 我刚刚阅读了你给我的链接。所以如果我按照逻辑,我可以使用THRESH_BINARY_INV 来包装所有不是白色的东西吗? (不仅是黑色,假设圆圈是一个物体,帽子有不同颜色的表面)。这是我的最后一个问题。先感谢您。问候
    • 我没有尝试过THRESH_BINARY_INV,但是是的:它会“包裹”所有比阈值更暗的东西(在你的情况下=200)。更准确地说:它会返回一个带有白色圆圈的黑白图像thresh,通过轮廓提取方法将其理解为前景。 (您可能希望显示中间图像 thresh 以更好地了解正在发生的事情。)
    • 我了解(我运行了一些示例)。但是为什么您网站上的论文链接不起作用?