Я хочу удалить границу с помощью opencv - PullRequest
0 голосов
/ 05 июля 2018

У меня есть оригинальное изображение:

image

тогда я применил следующий код к

  1. Преобразование исходного изображения в изображение HSV
  2. Затем, используя cv2.findContours(), я составил список, содержащий все контуры.

  3. Тогда я удалил все контуры области меньше 30.

  4. Тогда я получил следующее изображение:

image

То, что я хочу, это удалить границу полученного изображения, которое бесполезно (внешняя граница листа). Мне нужны только внутренние участки листа. Это код, который я использовал.

import cv2
import numpy as np
img = cv2.imread('Apple___Blackrot30.JPG')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)     
lower_gr = np.array([25,0,0])
upper_gr = np.array([90,255,255])
mask = cv2.inRange(hsv,lower_gr,upper_gr)
mask=~mask   
res = cv2.bitwise_and(img,img,mask = mask)
blur = cv2.bilateralFilter(res,9,75,75)
im2,cont,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
areas = [cv2.contourArea(each_conts) for each_conts in cont]
cont_counter = 0
for each_conts in areas:
    if each_conts < 30:
        cv2.fillPoly(im2, pts =[cont[cont_counter]], color=(0,0,0))
    if each_conts > 1024:
        cv2.drawContours(mask, cont[cont_counter], 0, (255,255,255), -1)    
    cont_counter+=1

cv2.imshow('cn',im2)

1 Ответ

0 голосов
/ 05 июля 2018

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

Я только что добавил несколько дополнительных вещей в ваш код.

Код:

img2 = img.copy()
im2, cont, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

l = []
for e, h in enumerate(hierarchy[0]):
    #print (e, h[3])
    if h[3] == -1:
        l.append(e)

for i in l:
    if cv2.contourArea(cont[i]) < 1000:   
        cv2.drawContours(img2, [cont[i]], -1, (0, 255, 255), 2)

cv2.imshow('img2', img2)

Результат:

enter image description here

hierarchy возвращает массив, выражающий отношения родитель-потомок контуров. По ссылке на документацию

это массив из четырех значений: [Next, Previous, First_Child, Parent] .

В массиве hierarchy я отсканировал столбец Parent (4-й столбец), чтобы увидеть, нет ли у него родительских контуров (-1), и нарисовал их

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