1

画像の範囲を取る方法を教えてください。範囲 0:120 ガンマ = 1.8 のピクセルに対して「cameraman.tif」のガンマ補正を行いたい、範囲 120:255 ガンマ = 0.5 のピクセルに対して

しかし、すべてのピクセルが最初の if ステートメントに移動するため、2 番目のガンマを適用できません。

a = imread('cameraman.tif');
gamma1 = 2;
gamma2 = 0.5;
N =size(a);
out = zeros(N);
for i=1:N
  for j=1:N
    temp=a(i,j);
    if temp>0&temp<120
       out(i,j)=temp.^2;
    end
    if temp>120&temp<=255
       out(kx,ky)=temp.^0.5;
    end
 end
end
imshow(out)
4

1 に答える 1

2

2 番目のifステートメントでは、アクセス変数kxky... を使用していiますj

out(i,j)=temp.^0.5;

また、平方根が機能するには、強度が倍精度であることを確認する必要があります。したがって、場所ごとに読み込まれた強度が にキャストされていることを確認してからdouble、完了したら に戻してuint8ください。実際には、画像全体をスイープしてから変換を行ってください。

for i=1:N
  for j=1:N
    temp=double(a(i,j)); % Change
    if temp>0&temp<120
       out(i,j)=temp.^2;
    end
    if temp>120&temp<=255
       out(i,j)=temp.^0.5; % Change
    end
 end
end

out = uint8(out); % Change

kxkyはコード内の別の場所に設定されており、変更されることはありません。つまり、2 番目のステートメントが発生した場合、ガンマの設定はとifでのみ定義された 1 つの場所でのみ発生することを意味します。あなたへの私のアドバイスは、異なるワークスペースで変数を相互汚染しないように、実際の関数を書くことです。これを関数に含めると、定義されていないことをすぐに知らせるエラーが表示されます。kxkykxky

ところで、ループなしでこれをより効率的に行うことをお勧めします。ベクトル化された同じ操作を非常に簡単に実行できます。doubleただし、デフォルトのタイプはuint8Cameraman 画像用であるため、これには画像を に変換する必要があります。したがって、 を使用double して画像を に変換doubleし、ガンマ補正を行ってから、 を使用して元に変換しuint8ます。

a = double(imread('cameraman.tif'));
out = zeros(size(a));
out(a > 0 & a < 120) = a(a > 0 & a < 120).^2;
out(a >= 120 & a <= 255) = a((a >= 120 & a <= 255).^0.5;
out = uint8(out);

コードの 1 行目と 2 行目はもちろんおなじみです。コードの 3 行目は、logical0 から 120 の間の強度を排他的に検索するマスクを見つけます。これらの値を見つけたら、同じ論理マスクを使用して元の画像にインデックスを付け、それらの値にのみアクセスし、各値を 2 乗して出力の同じ空間位置に設定します。120 から 255 の間で検索しているコードの最後の行についても同じことが言えますが、代わりに平方根を取っています。最後にuint8表示用に変換します。

于 2016-05-27T23:24:32.100 に答える