OpenCV - RETR_EXTERNAL не работает после бинаризации Оцу - PullRequest
0 голосов
/ 26 сентября 2018

Я применил бинаризацию Оцу к одному изображению и получил этот результат

enter image description here

После этого я использую этот код, чтобы получить квадраты вокруг четырехосновные формы:

img = cv.imread('test_bin.jpg', 0)
_, cnts, _ = cv.findContours(img.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)

for cnt in cnts:
    x,y,w,h = cv.boundingRect(cnt)
    cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

cv.imwrite('test_cnt.jpg', img)

Однако я ничего не получаю.Он возвращает только один контур, который, я думаю, может быть полным изображением.Я видел, что он работает для RETR_TREE, но мне нужно, чтобы он работал с RETR_EXTERNAL для следующих операций.Что здесь не так?

1 Ответ

0 голосов
/ 26 сентября 2018

В соответствии с контурами OpenCV документация :

В OpenCV поиск контуров подобен нахождению белого объекта на черном фоне.Помните, что объект, который нужно найти, должен быть белым, а фон должен быть черным.

Но в вашем случае это явно противоположно требованиям, поэтому вам просто нужно инвертировать изображение, и оно можетбыть просто сделано как:

img = cv2.bitwise_not(img)

Также обратите внимание, что:

Для большей точности используйте двоичные изображения.Поэтому, прежде чем находить контуры, примените определение пороговых значений или границ канни.

Я использовал ваше изображение и получил следующие результаты после инвертирования изображения.Если вы хотите удалить небольшие поля, просто используйте cv2.threshold, чтобы получить двоичное изображение.

enter image description here

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