2 番目のif
ステートメントでは、アクセス変数kx
とky
... を使用してい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
kx
とky
はコード内の別の場所に設定されており、変更されることはありません。つまり、2 番目のステートメントが発生した場合、ガンマの設定はとif
でのみ定義された 1 つの場所でのみ発生することを意味します。あなたへの私のアドバイスは、異なるワークスペースで変数を相互汚染しないように、実際の関数を書くことです。これを関数に含めると、定義されていないことをすぐに知らせるエラーが表示されます。kx
ky
kx
ky
ところで、ループなしでこれをより効率的に行うことをお勧めします。ベクトル化された同じ操作を非常に簡単に実行できます。double
ただし、デフォルトのタイプはuint8
Cameraman 画像用であるため、これには画像を に変換する必要があります。したがって、 を使用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 行目は、logical
0 から 120 の間の強度を排他的に検索するマスクを見つけます。これらの値を見つけたら、同じ論理マスクを使用して元の画像にインデックスを付け、それらの値にのみアクセスし、各値を 2 乗して出力の同じ空間位置に設定します。120 から 255 の間で検索しているコードの最後の行についても同じことが言えますが、代わりに平方根を取っています。最後にuint8
表示用に変換します。