0

特定の画像の輪郭を抽出するプロジェクトに取り組んでいます。2 つの画像があります。前景画像と背景画像。これらの画像に減算を適用し、差がゼロに等しくない場合に条件を付けます。次に、その座標値を出力します。ここに私の現在のコードがあります:

I=imread('starObject.jpg')

B=rgb2gray(I);
imshow(I);

A=imread('starB.jpg');
C=rgb2gray(A);
[columns rows]=size(C) 
Diff(i,j)=B(i,j)-C(i,j);
if (Diff(i,j)>0||Diff(i,j)<0)
    fprintf('1st difference');
    disp(Diff(i,j));
end 
end
end
imshow(Diff);  

上記のコードは、ピクセルの差分値を出力します。コーディネートが欲しい。どうやってやるの?

4

2 に答える 2

2

上記のコードijは、すでにピクセル座標です。印刷には、このようなものを使用できます

[rows, columns] = size(C); %# rows are first!!
for i = 1 : rows
    for j = 1 : columns
        if (Diff(i,j) ~= 0)
            sprintf('(%d, %d)', i, j);
        end
    end
end

例えば。

別のアプローチは、次のfind()ような関数を使用することです。

[r, c] = find(Diff ~= 0);
for idx = 1 : length(r)
    sprintf('(%d, %d)', r(idx), c(idx));
end

ところで、通常は複素数を定義するために and を使用するため、Matlab で変数としてandを使用することは非常に悪い考えです。驚かないでくださいij

x = 10 + 20*j

ループの後は機能しなくなります。

于 2012-08-29T06:44:53.607 に答える
1

コードをベクトル化します。座標を反復処理するために for ループを使用しないでください。遅く、醜く、言語がどのように記述されることを意図しているかではありません。以下がうまくいくかどうかを確認してください。

A    = rgb2gray (imread ('starObject.jpg'));
B    = rgb2gray (imread ('starB.jpg'));
Diff = B - C;
inds = find (Diff);
sprintf ("Different at indexes: %i\n", inds);

ライナー インデックスではなく添字を出力する場合は、 を使用ind2subして一方を他方に変換するか、2 つの出力引数で検索します。例えば:

[iRows, iCols] = find (Diff);
printf ("Different at coordinates (%i, %i)\n", [iRows'; iCols']);
于 2012-08-29T14:28:47.920 に答える