編集を参照してください
詳細を理解するために、組み込みアルゴリズムを使用する代わりに、ガウスぼかしアルゴリズムを MATLAB で独自に実装しようとしました。
私は興味深い実装を見つけました.誰かがその種のアルゴリズムをコーディングする方法をすでに尋ねています. だから、それはビジネスではありません。
さらに、次の式を使用して、 GIMPのように指定された半径の標準偏差を計算します。
stdDeviation = sqrt(-(radius^2) / (2*log10(1 / 255)));
私のアルゴリズムは、半径の値が小さい場合 (3、5、7 など) に問題なく動作します (少なくとも違いはわかりません)。半径 21 の画像をぼかしようとすると、出力は次のようになります。
GIMP の / MATLAB のimgaussfilt(A,sigma)
出力との比較:
明らかに、アルゴリズムは同じ (または少なくとも類似した) 出力画像を計算しません。imgaussfilt(A,sigma)
それとは別に、GIMP / MATLAB は何をしますか?
画像の境界線は無視できます。私はその問題を認識しています。しかし、出力画像の「奇妙なピクセル ストライプ」の原因がわかりません。
完全を期すために、ソース コードを次に示します。
function y = gaussianBlurSepTest(inputImage)
% radius in pixel; RADIUS MUST BE ODD!
radius = 21;
% approximate value for standard deviation
stdDeviation = sqrt(-(radius^2) / (2*log10(1 / 255)));
ind = -floor(radius/2):floor(radius/2);
[X, Y] = meshgrid(ind, ind);
h = exp(-(X.^2 + Y.^2) / (2*stdDeviation*stdDeviation));
h = h / sum(h(:));
redChannel = inputImage(:,:,1);
greenChannel = inputImage(:,:,2);
blueChannel = inputImage(:,:,3);
redBlurred = conv2(redChannel, h);
greenBlurred = conv2(greenChannel, h);
blueBlurred = conv2(blueChannel, h);
y = cat(3, uint8(redBlurred), uint8(greenBlurred), uint8(blueBlurred));
編集:
完全を期し、他の人を助けるために: 私は erfan の修正を適用しました。結果ははるかに良くなりましたが、gimp の計算との明らかな違いがまだ見られます。GIMP の結果は「よりスムーズ」に見えます。
実装されたアルゴリズム:
function y = gaussianBlurSepTest(inputImage)
radius = 21;
stdDeviation = sqrt(-(radius^2) / (2*log10(1 / 255)));
ind = -floor(radius/2):floor(radius/2);
[X, Y] = meshgrid(ind, ind);
[~, R] = cart2pol(X, Y); % Here R is defined
h = exp(-R.^2 / (2*stdDeviation*stdDeviation));
h = h / sum(h(:));
h(R > radius/2) = 0;
h = h / sum(h(:));
redChannel = inputImage(:,:,1);
greenChannel = inputImage(:,:,2);
blueChannel = inputImage(:,:,3);
redBlurred = conv2(redChannel, h);
greenBlurred = conv2(greenChannel, h);
blueBlurred = conv2(blueChannel, h);
y = cat(3, uint8(redBlurred), uint8(greenBlurred), uint8(blueBlurred));
質問に完全に答え、同じ質問を持つ他の人を助けるという点で、違いの起源を尋ねることは役立つかもしれないと思います.
ありがとうございました!