Поиск самых больших прямоугольников в изображениях с помощью оптимизации

Проблема: у меня есть бинарное изображение с несколькими объектами. Мне нужно найти способ вписать в эти неправильные объекты максимально возможную площадь. см. изображение, прикрепленное ниже

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

Используя тот же подход, что и ответ Стефана в stackoverflow: подгонка круга к двоичному изображению Что касается моих параметров, я не могу понять, как оптимизировать параметры по сравнению с этой простой функцией стоимости.

import scipy.optimize as optimize
import numpy as np
import skimage.draw as draw
import skimage.measure as measure

def cost(params):
   baser,basec,deltar = params
   ycords = range(int(baser),int(baser + deltar))
   xcords = range(int(basec),int(basec + deltar))
   coords = draw.polygon(ycords,xcords,shape=region.image.shape)    
   template = np.zeros_like(region.image)
   template[coords] = 1
return -np.sum(template == region.image)
labels , nlabels = measure.label(img,neighbors=4,return_num=True)
regions = measure.regionprops(labels.astype(int))

for region in regions:
   minr, minc, maxr, _ = region.bbox
   baser = minr
   basec = minc
   deltar = maxr-minr   # One parameter in case of square

   print "intial :", baser,basec,deltar
   OptimizeResult = optimize.fmin(cost,(baser,basec,deltar),disp=True)

    baser,basec,deltar = OptimizeResult 
    print "final : " , OptimizeResult
    # the above 2 are same. and so the results don't change

Параметры не меняются, оптимизация останавливается на итерации 0. Стоимость тоже не меняется. Я пробовал разные решатели и оптимизировал.минимизировать. параметры не меняются.

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

Также прокомментируйте, является ли оптимизация хорошим способом решения этих проблем.

Аннотированное изображение в соответствии с запросом размещено ниже. Прямоугольники (предположим, квадраты после редактирования) на нескольких объектах выделены ЧЕРНЫМ цветом (извините за плохой выбор цвета) Аннотированное изображение


person iratzhash    schedule 20.10.2016    source источник
comment
Пожалуйста, аннотируйте изображение с решением, которое вам нужно.   -  person Yves Daoust    schedule 20.10.2016
comment
@YvesDaoust Добавлено, надеюсь, теперь все ясно.   -  person iratzhash    schedule 20.10.2016
comment
Это можно решить, используя эрозии с прямоугольным структурирующим элементом. Для заданной ширины элемента увеличивайте высоту до тех пор, пока области не исчезнут; затем перезапустите с увеличенной шириной. Это даст вам кривые (w, h) для каждой формы.   -  person Yves Daoust    schedule 20.10.2016
comment
Мне не нравится подход, основанный на оптимизации. Один из самых простых подходов будет использовать некоторую маркировку. -алгоритм для получения информации о подключенных пикселях. Затем, наивно, вы можете просто перебрать четыре измерения (x, y, x_length, y_length) и проверить, совпадают ли все помеченные пиксели (vals определяют обрезанное изображение). Конечно, можно отсечь кандидатов, если объем ниже текущего лучшего (если вы создаете свой цикл, чтобы сначала проверить самые большие) edit: забыл ротацию.   -  person sascha    schedule 20.10.2016
comment
Проблема с оптимизацией (по сравнению с подходом, который вы связали): (1) прямоугольник имеет еще одну степень свободы (2) вам, вероятно, придется делать это итеративно, отмечая используемые пиксели. Это означает, что вы должны включить это в задачу оптимизации, которая может быть нетривиальной (без дискретных переменных). (3) Хотя задача может быть выпуклой, не каждая ее формулировка будет выпуклой. Это приводит только к локально-оптимальным решениям. (4) Если вы подготовите свое изображение, проблема нахождения самого большого прямоугольника в многоугольнике будет полиномиально решаемой задачей — используйте эти алгоритмы.   -  person sascha    schedule 20.10.2016
comment
@sascha Ваше объяснение очень помогло, я убежден, что выпуклая оптимизация - плохая идея, но я до сих пор не уверен, почему это не сработало. Я попробовал ваши предложения: я изменил параметризацию на (x, y, x + x_length, y + y_length) и попытался подогнать ее под квадрат, как вы сказали в 1), иметь на одну степень свободы меньше и быть таким же, как у Стефана подходящий круг ответ. поэтому параметры Square теперь: (x, y, длина). тоже не получилось. Я тоже пробовал переключать решатели 4) какие алгоритмы вы имеете в виду? неработающей ссылке?   -  person iratzhash    schedule 21.10.2016
comment
@iratzhash Как вы ожидаете помощи здесь? Вы не предоставили ссылку на свое изображение, вы не опубликовали самозапускающийся код, включая некоторые текущие предположения (начало с прямоугольников, теперь квадраты). Очевидно, что с вашим текущим кодом будут проблемы. Вы используете неограниченную оптимизацию, и иногда параметры будут генерировать недопустимые значения, например, в отношении draw_polygon (поскольку ничто не ограничено, и у вас много размеров). Для Стефана это работает, так как он начинает в каком-то центре и имеет менее сложную проблему выбора (меньше затемнений), поэтому маловероятно, что начальная точка достигает какой-то проблемы.   -  person sascha    schedule 21.10.2016
comment
@sascha Изменил код в вопросе, не стало на один параметр меньше, так что те же степени свободы, что и у круга в ответе Стефана. Я беру начальное предположение о длине квадрата из строк ограничивающей рамки. Предположим, что аннотации представляют собой самые большие квадраты в регионах, а не прямоугольники. По размерам, на что вы ссылаетесь, разве количество параметров не совпадает с ответом Стефана (x0, y0, deltar)?   -  person iratzhash    schedule 21.10.2016
comment
@sascha: Чтобы избежать неоптимальных решений, regionprops.centroid может быть хорошим предположением для (x0, y0) и большего из размеров bbox для параметра длины. Я попробовал это сейчас, все еще не сходится. Что может быть лучше функции стоимости?   -  person iratzhash    schedule 21.10.2016
comment
@YvesDaoust Итак, я искажаю изображение с помощью прямоугольника selem за 2 цикла, пока изображение не исчезает, и сохраняю высоту и ширину. Как использовать эти кривые, чтобы найти прямоугольник?   -  person iratzhash    schedule 21.10.2016
comment
@iratzhash: в зависимости от того, что вы называете самым большим прямоугольником, найдите максимум W + H или W.H. Это тривиально.   -  person Yves Daoust    schedule 21.10.2016