Python 使用cv2.threshold()函数绘制轮廓

Python 使用cv2.threshold()函数绘制轮廓,python,python-2.7,opencv,contour,Python,Python 2.7,Opencv,Contour,我使用不同的值在中测试函数,但每次都会得到意外的结果。因此,这意味着我不理解以下因素的影响: 马克斯瓦尔 有人能帮我澄清一下吗 例如,我想按照白色绘制这颗星的轮廓: 以下是我得到的: 根据该代码: import cv2 im=cv2.imread('image.jpg') # read picture imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # BGR to grayscale ret,thresh=cv2.threshold(i

我使用不同的值在中测试函数,但每次都会得到意外的结果。因此,这意味着我不理解以下因素的影响:

  • 马克斯瓦尔
有人能帮我澄清一下吗

例如,我想按照白色绘制这颗星的轮廓:

以下是我得到的:

根据该代码:

import cv2    
im=cv2.imread('image.jpg') # read picture

imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # BGR to grayscale

ret,thresh=cv2.threshold(imgray,200,255,cv2.THRESH_BINARY_INV)

countours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)


cv2.drawContours(im,countours,-1,(0,255,0),3)
cv2.imshow("Contour",im)

cv2.waitKey(0)
cv2.destroyAllWindows()
每次更改
maxval
的值时,我都会得到一个奇怪的结果,我无法理解。那么,如何使用此函数正确绘制这颗星的轮廓呢


提前谢谢。

您可能想用一个非常简单的图像进行实验,它可以让您清楚地了解各种参数。下面所附图像的有趣之处在于,图像中显示的数字的灰度值等于该数字。例如,200用灰度值200写入。下面是您可以使用的python代码示例

import cv2

# Read image
src = cv2.imread("threshold.png", cv2.CV_LOAD_IMAGE_GRAYSCALE)

# Set threshold and maxValue
thresh = 127
maxValue = 255

# Basic threshold example
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);

# Find Contours 
countours,hierarchy=cv2.findContours(dst,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# Draw Contour
cv2.drawContours(dst,countours,-1,(255,255,255),3)

cv2.imshow("Contour",dst)
cv2.waitKey(0)
我从我最近写的一篇文章中复制了下面的图片。它用示例图像、Python和C++代码解释了各种参数。希望这有帮助

输入图像


结果图像您可能希望使用一个非常简单的图像进行实验,该图像可以清楚地让您了解各种参数。下面所附图像的有趣之处在于,图像中显示的数字的灰度值等于该数字。例如,200用灰度值200写入。下面是您可以使用的python代码示例

import cv2

# Read image
src = cv2.imread("threshold.png", cv2.CV_LOAD_IMAGE_GRAYSCALE)

# Set threshold and maxValue
thresh = 127
maxValue = 255

# Basic threshold example
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);

# Find Contours 
countours,hierarchy=cv2.findContours(dst,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# Draw Contour
cv2.drawContours(dst,countours,-1,(255,255,255),3)

cv2.imshow("Contour",dst)
cv2.waitKey(0)
我从我最近写的一篇文章中复制了下面的图片。它用示例图像、Python和C++代码解释了各种参数。希望这有帮助

输入图像


结果图像为了更准确地找到轮廓,可以对图像应用阈值,因为二值图像倾向于提供更高的精度,然后使用轮廓方法。希望这将有助于

为了更准确地找到轮廓,可以在图像上应用阈值,因为二值图像往往会提供更高的精度,然后使用轮廓方法。希望这将有助于

在这里,你可以使用颜色,然后选择一种颜色,轮廓的制作会很简单。试试吧,让我知道
在黑色和转换时,你有相同的黄色和白色,这就是为什么这不起作用的原因。

在这里,你可以使用颜色,然后选择一种颜色,轮廓的制作将非常容易尝试并让我知道
在黑色和白色转换中,你有相同的黄色和白色,这就是为什么这不起作用的原因

谢谢你的努力,但它不能正确回答我的问题。我已经更新了我的答案。请让我知道这是否有帮助。了解各种参数的最好方法是使用我给出的代码,修改参数,看看会发生什么。非常感谢。我必须仔细阅读你给我的教程。谢谢,不客气。在您的特定示例中,将图像转换为灰度后,黄色与白色非常接近。这可能会给你带来一些困惑。我在很多不同颜色的样本图像上测试了你的解决方案。它在所有情况下都有效,除了一些情况,例如黄色。也许你能给我一个提示如何解决这个问题。我知道,你已经回答了我的主要问题。但是,如果你认为最好在另一个问题中问这个问题,请告诉我。谢谢谢谢你的努力,但它没有正确回答我的问题。我已经更新了我的答案。请让我知道这是否有帮助。了解各种参数的最好方法是使用我给出的代码,修改参数,看看会发生什么。非常感谢。我必须仔细阅读你给我的教程。谢谢,不客气。在您的特定示例中,将图像转换为灰度后,黄色与白色非常接近。这可能会给你带来一些困惑。我在很多不同颜色的样本图像上测试了你的解决方案。它在所有情况下都有效,除了一些情况,例如黄色。也许你能给我一个提示如何解决这个问题。我知道,你已经回答了我的主要问题。但是,如果你认为最好在另一个问题中问这个问题,请告诉我。非常感谢。