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