Сегментация нарисованных от руки логических элементов в изображении - PullRequest
1 голос
/ 21 октября 2019

Входные логические логические элементы, нарисованные от руки

image

image

Я хочу отделить вентили от цепи, чтобы я мог работать на изолированном Svmизображения и может обнаружить тип ворот, но моя проблема здесь в том, как я могу обнаружить или сегментировать ворота в цепи?

1 Ответ

4 голосов
/ 22 октября 2019

Вот подход, чтобы изолировать логические элементы. Идея состоит в том, чтобы использовать cv2.HoughLinesP() для обнаружения линии. Получив обнаруженные линии, мы эффективно удаляем линии на маске, чтобы изолировать ворота. Отсюда мы выполняем морфологические операции для очистки изображения и получения единственного контура от каждого элемента. Наконец, мы выполняем фильтрацию контуров и извлечение ROI


Обнаруженные строки для удаления

image

Результаты

image

Извлеченные области интереса

enter image description here

В зависимости от входного изображения, вам может потребоваться изменить параметры в cv2.HoughLinesP() и минимальной области порога. С maxLineGap=50 и area > 1000, вот результаты с другим входным изображением

enter image description here

Я реализовал этот подход в Python OpenCV

import cv2
import numpy as np

# Grayscale + Otsu's threshold
image = cv2.imread('1.jpg')
original = image.copy()
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find lines
minLineLength = 10
maxLineGap = 150
lines = cv2.HoughLinesP(thresh,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(thresh,(x1,y1),(x2,y2),(0,0,0),5)

# Morphological operations to clean image
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,9))
close  = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Contour filtering and ROI extraction
ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > 3000:
        x,y,w,h = cv2.boundingRect(c)
        ROI = original[y:y+h,x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(image, (x, y), (x+w, y+h), (36, 255, 12), 8)
        ROI_number += 1

cv2.imwrite('thresh.png', thresh)
cv2.imwrite('close.png', close)
cv2.imwrite('image.png', image)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...