Разделите изображение на информацию о прямоугольниках в Python - PullRequest
1 голос
/ 22 марта 2019

У меня есть серия изображений, которые являются не чем иным, как серией цветных прямоугольников на черном фоне. Пример: enter image description here.Как я мог (используя PIL в Python 3.7) создать программу, которая бы идентифицировала эти прямоугольники (положение xy, цвет и размер)?Эффективность не очень важна, поэтому вложенные for допустимы.Каждый алгоритм, который я до сих пор смог придумать, имеет много недостатков и может пойти не так по-разному, или просто СЛИШКОМ слишком сложен и совсем не стоит

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вам вообще не нужно писать код, вы можете сделать это с ImageMagick , который установлен на большинстве дистрибутивов Linux и доступен для macOS и Windows.

Просто вТерминал (Командная строка в Windows), вы можете запустить:

magick convert image.png                            \
   -define connected-components:verbose=true        \
   -define connected-components:area-threshold=100  \
   -connected-components 4 -auto-level output.png

Пример вывода

Objects (id: bounding-box centroid area mean-color):
  0: 1200x714+0+0 651.2,369.3 703177 srgb(0,0,0)
  164: 1200x86+0+714 599.5,756.5 103200 srgb(255,21,0)
  2: 363x155+80+60 261.0,137.0 56265 srgb(255,255,255)
  26: 127x323+60+302 122.6,463.2 39668 srgb(255,255,255)
  54: 308x109+352+373 505.5,427.0 33572 srgb(255,255,255)
  1: 102x159+641+47 691.5,126.0 16218 srgb(255,255,255)
  53: 79x100+977+371 1016.0,420.5 7900 srgb(0,17,255)

Итак, глядя на строку, начинающуюся 0: тампрямоугольник размером 1200x714, начинающийся с 0,0 (верхний левый угол) с черным цветом, т.е. srgb (0,0,0).

Если посмотреть на следующую строку, есть прямоугольник размером 1200x86, начинающийся с 714пикселей вниз от верхнего левого угла с красным цветом, то есть srgb (255,21,0).

и т. д.

Последняя строка представляет собой прямоугольник 79x100, расположенный в [977,31] с синим цветом, т.е. srgb (0,17,255).

1 голос
/ 22 марта 2019

Я не знаю, насколько вы в порядке с OpenCV.

Если вы готовы использовать openCV, вы можете использовать findContours, чтобы получить нужные вещи.

Ниже приведен код:

    import cv2
    readImage= cv2.imread(r"<ImagePath>\oKvDi.png")
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    #Code to Find edges of Square using Canny edge detection method and finding Contours and drawing in Back Line

    edges = cv2.Canny(img_gray, 0, 100)
    contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    #Just for your reference to show all rectangles are found
    cv2.drawContours(readImage, contours, -1, (0, 0, 0), 5)
    cv2.imwrite(r"<ImageSavePath>/a.png",readImage)

Надеюсь, что это решит вашу проблему

...