問題: 複数のオブジェクトを含むバイナリ イメージがあります。これらの不規則なオブジェクトに可能な限り大きな正方形を収める方法を見つける必要があります。下に添付された画像を参照してください
以下に示すように、各ラベル付きオブジェクトの境界ボックスを初期推定として使用し、コスト関数を使用して、これを最適化問題として定式化しようとしました。境界ボックスの行は、正方形であるため、列の初期推測としても想定されます。
stackoverflow に関する Stefan の回答と同じアプローチを使用する:円をバイナリ イメージに適合させる 私のパラメータについては、この単純なコスト関数に対してパラメータを最適化する方法がわかりません
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 で停止し、コストも変更されません。さまざまなソルバーとoptimize.minimizeを試しました。パラメータは変更されません。
理想的には、各領域に長方形が必要です。各領域(バイナリオブジェクト)は異なる色で色分けされています
最適化がこれらの問題を解決する良い方法であるかどうかについてもコメントしてください。
リクエストされた注釈付きの画像を以下に掲載します。いくつかのオブジェクトの長方形 (編集後に正方形を想定) は黒です (色の選択が不十分で申し訳ありません)。