返事が遅れて申し訳ありません。今週末、スタックオーバーフローをチェックするのを忘れていました。
とにかく、私がすべきことは次のようなことです (グレースケールに簡略化されていますが、RGB で動作するように簡単に作成する必要があります)。
oim = original image
xc, yc = center point
d = distance from center point for in-focus
fval = zeros, matrix size of oim
max_blur = maximum blur radius
for all pixels (xp,yp) in oim
dist = sqrt((xp-xc)^2+(yp-yc)^2)
dist = dist-d // we only care about the area beyond the clear area
if dist>0
blur = dist
end
if blur>max_blur
blur = max_blur // this can also be scaled or whatever works for your needs
end
blur = round(blur)
fval(xp,yp) = blur
end
nim = oim
for b=1:max_blur
blurred = blur_function(oim,b)
for all pixels (xp,yp) in fval
if fval(xp,yp) == b
nim(xp,yp) = blurred(xp,yp)
end
end
end
nim は新しいイメージになりました
つまり、基本的にここで行われるのは、特定のピクセルをどれだけぼかすかを示す一種のルックアップ テーブルを最初に作成することです。フォーカス値は、クリア エリアからの各ピクセルの距離の関数です。これが行列 fval です。次に、画像を複数回ぼかし、そのたびに、ぼかした画像からの新しいピクセル データで新しい画像を更新し、その焦点ぼけレベルを更新する場合にのみ、特定のピクセルを更新します。
blur_function は何でもかまいません。これを自分でテストしたとき、MatLab で平均的なぼかしを使用しました。
お役に立てれば!