получить горизонтальную линию от самой низкой точки до обрезки - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь удалить лишний интервал в рисовании с помощью opencv. Моя цель - удалить лишние части из закрытого чертежа.

import cv2 
import numpy as np
name = '006.png'
img=cv2.imread(name)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = 255 - gray
thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY)[1]
kernel = np.ones((75,75), np.uint8)
mask = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
#cv2.imwrite('mask.png',mask)

input image, моя текущая маска получает именно те черные прямоугольники, которые помогут мне обрезать изображение.

mask image, я хочу обрезать изображение 4 раза (сверху, с обеих сторон, снизу), сделав соответственно горизонтальную линию самой нижней точки этой стороны. Мой ожидаемый результат: output image

1 Ответ

2 голосов
/ 06 мая 2020

Вот один из способов сделать это в Python / OpenCV.

  • Прочитать ввод
  • Преобразовать в оттенки серого
  • Порог
  • Применить морфология открыта, чтобы удалить тонкие внешние линии, затем морфология близко, чтобы соединить левую и правую половинки
  • Найдите самый большой контур
  • Получите ограничивающую рамку контура
  • Обрезайте изображение
  • Нарисовать контур на исходном изображении
  • Сохранить результаты

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('006.png')
hh, ww = img.shape[:2]

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# invert gray image
gray = 255 - gray

# threshold
thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY)[1]

# apply close and open morphology
kernel = np.ones((3,3), np.uint8)
mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

# get largest contour
contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
big_contour = max(contours, key=cv2.contourArea)
x,y,w,h = cv2.boundingRect(big_contour)

# draw contour on input
contour_img = img.copy()
cv2.drawContours(contour_img,[big_contour],0,(0,0,255),3)

# crop to bounding rectangle
crop = img[y:y+h, x:x+w]

# save cropped image
cv2.imwrite('006_thresh.png',thresh)
cv2.imwrite('006_mask.png',mask)
cv2.imwrite('006_contour.png',contour_img)
cv2.imwrite('006_cropped.png',crop)

# show the images
cv2.imshow("THRESH", thresh)
cv2.imshow("MASK", mask)
cv2.imshow("CONTOUR", contour_img)
cv2.imshow("CROP", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()


Изображение с пороговым значением:

enter image description here

Изображение маски с очищенной морфологией:

enter image description here

Контур на исходном изображении:

enter image description here

Обрезанное изображение:

enter image description here

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