2

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

Мое решение состояло в том, чтобы сформулировать это как проблему оптимизации и позволить ограниченным оптимизаторам Scipy решить ее [код см. Ниже]. Это, по-видимому, проблематично, так как это integer problem (croping принимает целочисленные координаты в верхнем и левом углах в качестве параметров). И действительно, fmin_cobyla не может найти решение после некоторого времени выполнения 20 секунд, тогда как fmin_slsqp завершится с ошибкой после одной итерации с помощью «Сингулярная матрица C в подзадаче LSQ (режим выхода 6)».

Любые идеи о том, как я мог бы решить эту проблему в противном случае? Есть ли случайно библиотека, которая обрабатывает проблемы оптимизации на изображениях?


from skimage.filters import sobel 
from PIL import Image 
from scipy.optimize import fmin_slsqp 

def objective(x): 
    # minimize the area 
    return abs((x[2] - x[0]) * (x[3] - x[1])) 

def create_ratio_constr(img): 
    def constr(x): 
     # 81% of the image energy should be contained 
     x = tuple(map(int, x)) 
     crop = img.crop((x[0], x[1], x[2], x[3])) 
     area_ratio = round(sum(list(crop.getdata()))/
          float(sum(list(img.getdata()))), 2) 
     if area_ratio == 0.81: 
      return 0.0 
     return -1 
    return constr 

def borders_constr(x): 
    x = tuple(map(int, x)) 
    # 1st point is up and left of 2nd point 
    rectangle = x[0] < x[2] and x[1] < x[3] 

    # only positive values valid 
    positive = x[0] > 0 and x[1] > 0 

    if rectangle and positive: 
     return 0.0 
    return -1 

img = Image.open("/some/path.jpg") 
# get the edges 
edges = Image.fromarray(sobel(img.convert("L"))) 

ratio_constr = create_ratio_constr(edges) 
x = fmin_slsqp(objective, 
       (0, 0, edges.size[0]-1, edges.size[1]-1), 
       [borders_constr, ratio_constr], 
       disp=1) 

print x 
+0

Попробуйте использовать функции ограничения записи, которые сообщают оптимизатору о том, насколько нарушено ограничение. Двоично-значные ограничения не являются полезными, поскольку оптимизатор предполагает непрерывные функции ограничения. Однако он может работать для функций, которые являются «непрерывными, за исключением квантования пикселей». Вы также не можете указать ограничение равенства, подобное этому как неравенство, из-за предположений о непрерывности. COBYLA имеет ограничения равенства. –

ответ

0

я бы, вероятно, проигнорировать требование целого для углов области кадрирования и решить проблему расслабленной. Затем рассмотрите перемещение обрезанных ребер в или из ближайшего целого пикселя. Если это для эстетических целей, пиксель +/- части, вероятно, не имеет значения. Если это должно быть правильно, есть только четыре края, которые нужно учитывать в двух местах, поэтому не должно быть большого труда найти один из 16 вариантов, который лучше всего.

+0

Это то, что я делаю в предоставленном коде. Алгоритмы минимизации работают над значениями с плавающей запятой, а выходные значения только округляются в функции ограничения (поскольку обрезка не работает на поплавках). Однако даже этого, кажется, достаточно проблемы, чтобы сделать это неразрешимым, если я понимаю связанный вопрос: [Почему я не могу установить ограниченную оптимизацию SciPy для целочисленного программирования?] (Http://stackoverflow.com/questions/15793381/ why-cant-i-rig-scipys-constrained-optimization-for-integer-programming? lq = 1) правильно. – Zakum

+1

Обратите внимание, что ваши формулировки проблемы не являются релаксацией непрерывной проблемы, так как у вас есть двоично-значные ограничения. Ограничения должны быть записаны так, чтобы они были, по крайней мере, непрерывными функциями (предпочтительно дифференцируемыми), если вы пренебрегаете квантованием пикселей. –

Смежные вопросы