2

私は写真を持っており、エッジ エネルギーの特定の割合を同時に保持する最小限の領域でクロップを見つけたいと考えています。

これに対する私の見解は、これを最適化問題として定式化し、scipy の制約付きオプティマイザーに解決させることでした [コードは以下を参照]。これは整数の問題であるため、明らかに問題があります(クロッピングは左上隅と右下隅の整数座標をパラメーターとして受け取ります)。実際fmin_cobyla、実行時間の約 20 秒後に解決策を見つけることができませんが、 「 LSQ サブ問題の特異行列 C (終了モード 6)fmin_slsqp 」で 1 回の反復後に失敗します。

そうでなければ、この問題にどのように取り組むかについてのアイデアはありますか? 画像の最適化問題を処理するライブラリはありますか?


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
4

1 に答える 1