使用 python 中的 opencv 库对图像进行阈值处理,使用 for 循环使用不同的标志

Thresholding image using opencv library in python with different flags using for loop

我将 cv2 作为 cv 导入,创建了一个阈值标志列表,将 'cv.' 与标志连接起来,然后创建了一个 for 循环以将标志作为参数传递。但是 python 显示 TypeError。我附上了输出图像。请帮助我使用循环或其他方式创建所有可能的阈值,但每次都明确提及标志。

[]

这可能是相关的:OpenCV Thresholding example

首先,没有必要使用range,你可以简单地做for flag in titles:并传递flag。您是否检查过图像是否正确加载?您确定您的标志对您的错误负责吗?

对于以后的帖子,请包括一个最小的可重现示例。

您的代码无法正常工作,因为标志的类型是 int 而不是 string

您可以打印类型:print(type(cv.THRESH_BINARY))
结果是<class 'int'>

您可以创建 int 的列表:

th_flags = [cv.THRESH_BINARY, cv.THRESH_BINARY_INV, cv.THRESH_TRUNC, cv.THRESH_TOZERO, cv.THRESH_TOZERO_INV]

for th in th_flags:
    retval, thresh = cv.threshold(img, 127, 255, th)
    cv.imshow('thresh', thresh)
    cv.waitKey(1000)

cv.destroyAllWindows()

代码没有涵盖所有可能的选项
很少有标志可以使用求和来组合。

示例:

_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

在 OpenCV 中,给定的阈值选项(例如 cv.THRESH_BINARY 或 cv.THRESH_BINARY_INV)实际上是常量整数值。您正在尝试使用字符串而不是这些整数值。这就是您收到类型错误的原因。如果您想在一个循环中应用所有这些不同的阈值,一种选择是为这些选项创建一个不同的列表,如下所示:

threshold_options = [cv.THRESH_BINARY, cv.THRESH_BINARY_INV, ...]

这样,您就可以在循环中使用此列表的值,如下所示:

retval, thresh = cv.threshold(img, 127, 255, threshold_options[i])

整个代码如下:

titles = [ 'THRESH_BINARY',
'THRESH_BINARY_INV',
'THRESH_MASK',
'THRESH_OTSU',
'THRESH_TOZERO',
'THRESH_TOZERO_INV',
'THRESH_TRIANGLE',
'THRESH_TRUNC']

threshold_options = [ cv.THRESH_BINARY,
cv.THRESH_BINARY_INV,
cv.THRESH_MASK,
cv.THRESH_OTSU,
cv.THRESH_TOZERO,
cv.THRESH_TOZERO_INV,
cv.THRESH_TRIANGLE,
cv.THRESH_TRUNC]


for i in range(len(titles)):
    retval, thresh = cv.threshold(img, 127, 255, threshold_options[i])
    plt.subplot(2,3,i+1), plt.title(titles[i]), plt.imshow(thresh, 'gray')
plt.show()