Пороговое изображение с использованием библиотеки opencv в python с разными флагами с использованием цикла for

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

[Вывод кода - Jupyter]


person Fu678    schedule 31.03.2020    source источник
comment
Пожалуйста, предоставьте справочную информацию о ваших данных. Что такое данные, источник данных и что вы пытаетесь сделать?   -  person Gangula    schedule 31.03.2020


Ответы (3)


В 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()
person José Morano    schedule 31.03.2020

Это может быть связано с: пример порогового значения OpenCV

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

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

person code-lukas    schedule 31.03.2020

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

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

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

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)
person Rotem    schedule 31.03.2020