1

次のコードを使用して画像を手動で回転させようとしています。

clc;
m1 = imread('owl','pgm'); % a simple gray scale image of order 260 X 200
newImg = zeros(500,500);
newImg = int16(newImg);
rotationMatrix45 = [cos((pi/4)) -sin((pi/4)); sin((pi/4)) cos((pi/4))];

for x = 1:size(m1,1)
    for y = 1:size(m1,2)
        point =[x;y] ;
        product = rotationMatrix45 * point;
        product = int16(product);
        newx =product(1,1);
        newy=product(2,1);
        newImg(newx,newy) = m1(x,y);
    end
end
imshow(newImg);

単純に、画像のすべてのピクセルを反復処理しm1、m1(x、y)に回転行列を掛けて、を取得x',y'し、inの値を `newImg(x'、y')'に格納しますがm1(x,y)次のエラーが発生します。

??? Attempted to access newImg(0,1); index must be a positive integer or logical.

Error in ==> at 18
        newImg(newx,newy) = m1(x,y);

何が間違っているのかわかりません。

4

3 に答える 3

1

角が元の画像座標から回転するため、回転した画像の一部は負 (またはゼロ)newxと値になります。またはが正でない場合newyに値を割り当てることはできません。これらは有効なマトリックス インデックスではありません。1 つの解決策は、この状況を確認し、そのようなピクセルをスキップすることです ( を使用) 。newImgnewxnewycontinue

もう 1 つの解決策は、newImg を十分に拡大することですが、それにはもう少し複雑な変換が必要になります。

imrotateこれは宿題だから使えないという前提ですか?

于 2012-11-12T12:52:16.090 に答える
0

問題は単純ですが、答えはそうではないかもしれません: Matlab arrays1 から N までのインデックスが付けられます (多くのプログラミング言語では 0 から (N-1) までです)。

多分試してみてくださいnewImg( max( min(1,newX), m1.size() ) , max( min(1,newY), m1.size() ) )(Matlabが動作していないので、動作するかどうかはわかります)が、結果の画像はトリミングされます。

于 2012-11-12T12:55:46.520 に答える
0

これは古い投稿なので、OPには役立たないと思いますが、彼の試みに助けられたので、修正したコードをここに投稿します。基本的に、割り当てられていないピクセルをどのように処理するか、および写真の元のサイズを維持するかどうかに関して、実装にある程度の自由があります。これにより、「外側」にある領域をトリミングする必要があります。次の関数は、画像をその中心を中心に回転させ、割り当てられていないピクセルを「焼き付け」のままにし、エッジをトリミングします。

function [h] = rot(A,ang)
rotMat = [cos((pi.*ang/180)) sin((pi.*ang/180)); -sin((pi.*ang/180)) cos((pi.*ang/180))];
centerW = round(size(A,1)/2);
centerH = round(size(A,2)/2);
h=255.* uint8(ones(size(A)));
for x = 1:size(A,1)
    for y = 1:size(A,2)
        point =[x-centerW;y-centerH] ;
        product = rotMat * point;
        product = int16(product);
        newx =product(1,1);
        newy=product(2,1);
            if newx+centerW<=size(A,1)&& newx+centerW > 0 && newy+centerH<=size(A,2)&& newy+centerH > 0 
            h(newx+centerW,newy+centerH) = A(x,y);
            end
    end
end
于 2014-04-17T17:45:13.827 に答える