4

私の質問は、非常に簡単に解決できる問題に関するものですが、そのためのベスト プラクティスを学びたいと思っています。(名目上は Matlab 用ですが、実際には言語固有ではありません)。

任意のサイズの画像を読み込んでおり、事前定義されたサイズ (フレームと呼びましょう) の黒い画像内に (スケーリングやアスペクト比の変更なしで) 収まるようにする必要があります。ロードされた画像は、いずれかまたは両方の寸法で、事前定義されたフレームよりも小さい、等しい、または大きい場合があります。

画像がフレームよりも小さい場合は、フレーム サイズまでゼロで埋めて (周囲に黒い境界線が表示されます)、中央に配置します。大きい場合は中央揃えでトリミングしたいです。

理想的には、どちらの次元でもピクセル数のパリティを仮定したくありません。つまり、ロードされた画像とフレームの両方が、両方の次元で奇数または偶数のピクセル数を持つことができます。確かにいくつかの丸めが行われます。

この問題は研究され、解決され、使い果たされていると確信しているので、画像処理の経験がある知識豊富なプログラマーにとっては非常に難しい質問ではないはずです:)

4

1 に答える 1

1

これは、フレームよりも小さい、等しい、大きいサイズのグレースケール画像とカラー画像の両方で機能するはずです。読みやすくしようとしました。

frameWidth = 800;
frameHeight = 600;
imagepath = 'smaller.jpg'; % 'equal.jpg', 'larger.jpg'

img = im2double(imread(imagepath));
[imgHeight, imgWidth, channels] = size(img);
frame = zeros(frameHeight, frameWidth, channels);

dImageWidth = round((frameWidth - imgWidth)/2);
dImageHeight = round((frameHeight - imgHeight)/2);

unEqualHeight = (imgHeight ~= frameHeight);
unEqualWidth = (imgWidth ~= frameWidth);

if imgHeight <= frameHeight
    frameVStart = max(1, dImageHeight);
    frameVEnd = min(frameHeight, frameHeight-dImageHeight-unEqualHeight);
    imgVStart = 1;
    imgVEnd = imgHeight;
else
    frameVStart = 1;
    frameVEnd = frameHeight; 
    imgVStart = max(1, -dImageHeight);
    imgVEnd = min(imgHeight, imgHeight+dImageHeight);
end

if imgWidth <= frameWidth
    frameHStart = max(1, dImageWidth);
    frameHEnd = min(frameWidth, frameWidth-dImageWidth-unEqualWidth);
    imgHStart = 1;
    imgHEnd = imgWidth;
else
    frameHStart = 1;
    frameHEnd = frameWidth; 
    imgHStart = max(1, -dImageWidth);
    imgHEnd = min(imgWidth, imgWidth+dImageWidth);
end

frame(frameVStart:frameVEnd, frameHStart:frameHEnd, :) = ...
    img(imgVStart:imgVEnd, imgHStart:imgHEnd, :);

imshow(frame);
于 2012-06-05T14:37:34.037 に答える