OpenCV, cv2.approxPolyDP () Dr aws двойные линии на замкнутом контуре - PullRequest
2 голосов
/ 12 марта 2020

Я хочу создать несколько полигонов из этой маски:

image 1 - Mask Mask

Итак, я создал эти контуры с помощью openCV findcontours ():

изображение 2 - Контуры

Contours

При создании полигонов я получаю следующие полигоны:

изображение 3 - Полигоны Polygons

Как видите, некоторые многоугольники нарисованы с использованием двойных линий. Как мне предотвратить это?

См. Мой код:

import glob
from PIL import Image
import cv2
import numpy as np


# Let's load
image = cv2.imread(path + "BigOneEnhanced.tif") 

# Grayscale 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

# Find Canny edges 
edged = cv2.Canny(gray, 30, 200) 

# Finding Contours 
contours, hierarchy = cv2.findContours(edged,  
    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) 

canvas = np.zeros(image.shape, np.uint8)

# creating polygons from contours

polygonelist = []

for cnt in contours:

    # define contour approx
    perimeter = cv2.arcLength(cnt,True)
    epsilon = 0.005*cv2.arcLength(cnt,True)
    approx = cv2.approxPolyDP(cnt,epsilon,True)


    polygonelist.append(approx)

cv2.drawContours(canvas, polygonelist, -1, (255, 255, 255), 3)


imgB = Image.fromarray(canvas)
imgB.save(path + "TEST4.png")

1 Ответ

2 голосов
/ 12 марта 2020

Источником проблемы является обнаружение хитрых ребер :

После применения обнаружения ребра вы получаете два контура для каждого исходного контура - один вне края и один внутри края (и другие странные вещи).

Вы можете решить эту проблему, применив findContours без использования Canny.

Вот код:

import glob
from PIL import Image
import cv2
import numpy as np

path = ''

# Let's load
#image = cv2.imread(path + "BigOneEnhanced.tif") 
image = cv2.imread("BigOneEnhanced.png") 

# Grayscale 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

# Apply threshold (just in case gray is not binary image).
ret, thresh_gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Find Canny edges 
#edged = cv2.Canny(gray, 30, 200)

# Finding Contours cv2.CHAIN_APPROX_TC89_L1
#contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

contours, hierarchy = cv2.findContours(thresh_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

canvas = np.zeros(image.shape, np.uint8)

# creating polygons from contours
polygonelist = []

for cnt in contours:
    # define contour approx
    perimeter = cv2.arcLength(cnt, True)
    epsilon = 0.005*perimeter #0.005*cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, epsilon, True)

    polygonelist.append(approx)

cv2.drawContours(canvas, polygonelist, -1, (255, 255, 255), 3)

imgB = Image.fromarray(canvas)
imgB.save(path + "TEST4.png")

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

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