2016-05-27 33 views
1

画像の範囲を取る方法を教えてください。 0:120ガンマ= 1.8、120:255ガンマ= 0.5ピクセルの場合は "cameraman.tif"のガンマ補正を行いたい場合ガンマ= 0.5Matlabの範囲 - ガンマ補正

しかし、 2番目のガンマを適用する。

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

あなたはまた、確認強度ことを行う必要があります。

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) 

答えて

2

あなたの二ifの文は、私はあなたがijを使用していたと仮定しています....アクセス変数kxkyを使用しています平方根が働く倍精度です。したがって、場所ごとに読み込まれる強度が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はあなたのコードのどこかに設定し、決して変更されていないので、これは第二if文が起きないときや、ガンマの設定は1箇所のみ発生した場合のみ、kxで定義されていることを意味およびky。あなたのアドバイスは実際の関数を書いて、違う作業場の変数を混入させないようにすることです。これを関数に含めると、すぐにエラーkxkyが定義されていないことがわかります。

ところで、私はむしろループなしでこれをより効率的にやります。あなたは非常に簡単にベクトル化された同じ操作を実行することができます。ただし、これはカメラの画像のデフォルトタイプがuint8であるため、画像をdoubleに変換する必要があります。したがって、uint8を使用してバック変換し、次に、ガンマ補正を行い、doubleに画像を変換するdoubleを使用:

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); 

コードの第一及び第二のラインを当然熟知しています。 3行目のコードはlogicalのマスクを検索し、0から120の間の強度を検索します。これらの値が見つかると、同じ論理マスクを使用して元のイメージにインデックスを付け、それらの値にアクセスし、各値を四角で囲み、それらを出力の同じ空間位置に設定します。 120と255の間で検索しているコードの最後の行についても同様ですが、代わりに平方根をとっています。最後にuint8に変換して表示します。

+1

そして、私はあなたが今で編集している確信しているとして、それはより良い –

+0

ハハ、eccoloの資格 –

+0

:-)ベクトル化完了だ@LuisMendo:D:D:D笑...えっドロップする他の靴を待っていますか? – rayryeng

関連する問題