Обнаружение области контура - PullRequest
0 голосов
/ 16 марта 2019

Я разрабатываю систему анализа дефектов, в которой можно найти область дефектного плода. Я нахожусь на начальных этапах своего развития. Я использую opencv и python.

Я использовал следующий код для поиска контуров:

im = cv2.imread('Mango_49_A.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(im, contours, -1, (0,255,0), 3)

Для нахождения области я использую следующий код:

if len(contours) != 0:
    for (i, c) in enumerate(contours):
        area = cv2.contourArea(c)
        if area < area_of_the_mango1:
            print(area)
            area_of_the_defected_region1 += area
            cv2.drawContours(img, c, -1, (255,255,0), 12)

Результат: enter image description here

Я хочу рассчитать контур только внутри манго. Результат, который я получаю, вычисляет площадь контура для: 1. Полная граница изображения 2. Манго 3. Дефекты в манго

Так как он вычисляет площадь вышеупомянутых трех областей, площадь дефектной области выше, чем площадь области манго.

Помогите мне рассчитать площадь контура внутри одного манго.

1 Ответ

0 голосов
/ 16 марта 2019

Тот факт, что вы получаете внешнюю границу и некоторые крошечные контуры как часть фона, указывает на тот факт, что пороговое значение не идеально для отделения переднего плана от фона.

Для этой строки:

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

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

Кроме того, вы можете использовать морфологические фильтры (например, размывать), чтобы немного очистить порог

Основная проблема с тем, как вы в настоящее время получаете контуры, заключается в следующем: cv2.RETR_TREE. Согласно документации findContours вы можете получить только те внешние контуры, которые вам нужны:

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

В качестве следующего шага вы можете взглянуть на контурные функции , такие как contourArea, которые вы уже используете, а также на аппроксимацию контура и выпуклую оболочку.

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