Определение порога изображения с использованием библиотеки opencv в python с разными флагами, использующими цикл for - PullRequest
0 голосов
/ 31 марта 2020

Я импортировал cv2 как cv, создал список пороговых флагов, объединил 'cv.' с флагами, а затем создал для l oop для передачи флагов в качестве аргументов. Но python показывает TypeError. Я приложил изображение вывода. Пожалуйста, помогите мне создать все возможные пороги, используя al oop или каким-либо другим способом, за исключением явного упоминания флагов каждый раз.

[Output of the code - Jupyter]

Ответы [ 3 ]

1 голос
/ 31 марта 2020

В OpenCV заданные пороговые параметры (например, cv.THRESH_BINARY или cv.THRESH_BINARY_INV) на самом деле являются постоянными целочисленными значениями. Вы пытаетесь использовать строки вместо этих целочисленных значений. Это причина, почему вы получаете ошибку типа. Если вы хотите применить все эти различные пороговые значения в al oop, один из вариантов - создать другой список для этих параметров, например:

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

Таким образом, вы можете использовать значения этого список в l oop выглядит следующим образом:

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()
0 голосов
/ 31 марта 2020

Ваш код не работает, поскольку тип флагов int, а не string.

Вы можете напечатать тип: print(type(cv.THRESH_BINARY)).
Результат - <class 'int'>.

Вы можете создать список из int s:

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)
0 голосов
/ 31 марта 2020

Это может быть связано: Пример OpenCV Thresholding

Прежде всего, нет необходимости использовать range, вы можете просто сделать for flag in titles: и передать flag. Вы проверили, правильно ли загружено ваше изображение? Вы уверены, что ваш флаг отвечает за вашу ошибку?

Для будущих постов, пожалуйста, включите минимальный воспроизводимый пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...