Как обнаружить все прямоугольные angular ящики python opencv, ничего не пропуская - PullRequest
3 голосов
/ 30 января 2020

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

Изображение: This is the image that I want to detect.

Мой код:

#!/usr/bin/python
import cv2
import numpy as np

im = cv2.imread("table.png")

image = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(image,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

edge = cv2.Canny(thresh,30,200)
cont = cv2.findContours(edge,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

for j,i in enumerate(cont):
   x,y,w,h = cv2.boundingRect(i)

   if (w*h>900):
     cv2.drawContours(image,[i],0,(0,0,255),3)

cv2.imshow("Image",image)

cv2.waitKey(0)  

ВЫХОД:

My output

1 Ответ

4 голосов
/ 30 января 2020

Вот простой подход с использованием порога + морфологические операции.

  1. Получение двоичного изображения. Загрузка изображения, преобразование в оттенки серого, затем адаптивный порог

  2. Заливка прямоугольников angular контуров. Поиск контуров и заполнение контуров для создания заполненных прямоугольников angular блоков.

  3. Выполните морфинг открытия. Мы создаем прямоугольный angular структурирующий элемент и морфинг открытия, чтобы удалить линии

  4. Рисование прямоугольника. Поиск контуров и рисование ограничивающих прямоугольников .


Вот каждый визуализированный шаг:

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

image

Двоичное изображение

image

Заполненный прямоугольник angular контуры

image

Морфинг открыт

image

Результат

image


Код

import cv2

# Load iamge, grayscale, adaptive threshold
image = cv2.imread('1.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,51,9)

# Fill rectangular contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(thresh, [c], -1, (255,255,255), -1)

# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4)

# Draw rectangles
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.waitKey()

Примечание: В зависимости от изображения может потребоваться изменить размер ядра. Например, может потребоваться увеличить ядро ​​с (5, 5) до (11, 11). Кроме того, вы можете увеличить или уменьшить количество итераций при выполнении cv2.morphologyEx(). При увеличении или уменьшении размера ядра существует компромисс, так как вы можете удалить больше или меньше строк. Опять же, все зависит от входного изображения.

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