Вот кое-что для начала: наивный алгоритм, который обходит ваше изображение и создает прямоугольники как можно большего размера. Как и сейчас, он только помечает прямоугольники, но не сообщает координаты или значения. Это делается для визуализации только одного алгоритма.
Ему не нужны никакие внешние библиотеки, кроме PIL, для загрузки и доступа к левому изображению при сохранении в формате PNG. Я предполагаю, что границу из 15 пикселей вокруг можно игнорировать.
from PIL import Image
def fill_rect (pixels,xp,yp,w,h):
for y in range(h):
for x in range(w):
pixels[xp+x,yp+y] = (255,0,0,255)
for y in range(h):
pixels[xp,yp+y] = (255,192,0,255)
pixels[xp+w-1,yp+y] = (255,192,0,255)
for x in range(w):
pixels[xp+x,yp] = (255,192,0,255)
pixels[xp+x,yp+h-1] = (255,192,0,255)
def find_rect (pixels,x,y,maxx,maxy):
# assume we're at the top left
# get max horizontal span
width = 0
height = 1
while x+width < maxx and pixels[x+width,y] == (0,0,0,255):
width += 1
# now walk down, adjusting max width
while y+height < maxy:
for w in range(x,x+width,1):
if pixels[x,y+height] != (0,0,0,255):
break
if pixels[x,y+height] != (0,0,0,255):
break
height += 1
# fill rectangle
fill_rect (pixels,x,y,width,height)
image = Image.open('A.png')
pixels = image.load()
width, height = image.size
print (width,height)
for y in range(16,height-15,1):
for x in range(16,width-15,1):
if pixels[x,y] == (0,0,0,255):
find_rect (pixels,x,y,width,height)
image.show()
Из вывода
вы можете Заметим, что алгоритм обнаружения можно улучшить, так как, например, «очевидные» два верхних левых прямоугольника разбиты на 3. Аналогично, более крупная структура в центре также содержит на один прямоугольник больше, чем абсолютно необходимо.
Возможные улучшения: либо настроить подпрограмму find_rect
для определения наилучшего соответствия¹, либо сохранить координаты и использовать математику (за пределами моего кена), чтобы найти прямоугольники, которые можно объединить.
further Еще одна идея на этом. В настоящее время все найденные прямоугольники немедленно заполняются цветом «найдено». Вы можете попытаться обнаружить явно несколько прямоугольников, а затем, после маркировки первого, другой прямоугольник (и) для проверки может быть либо черным , либо красным. Если бы не манжета, я бы сказал, что вам нужно попробовать разные порядки сканирования (сверху вниз или назад, слева направо или назад), чтобы на самом деле найти минимально необходимое количество прямоугольников в любой комбинации.