6

画像の正規化、画像の範囲、および画像のスケーリングと混同しています。私はアルゴリズムを使用しています(前の質問でアルゴリズムをアップロードしました)。アルゴリズムを適用した後、ウィキペディアの次の式を使用して画像を正規化しています。

ここに画像の説明を入力

MATLAB から使用getrangefromclass(filtImag1{i})すると、アルゴリズムを適用する前の行列の範囲は [0 255] であり、アルゴリズムを適用した後の範囲は [0 1] です。

問題は、正規化式が正しいかどうかを調べるために参照を見つける必要があることです。また、それぞれ600枚の画像を含む5つの画像スタックがあります。スタックごとにアルゴリズムを適用しました。アルゴリズムの結果はスタックごとに 10 個の画像であるため、最終的には 50 個の画像を分析して比較する必要があります。50 個の画像の最大値と最小値を見つけ、各画像を式に渡して画像を正規化します。

画像の範囲は [0 1] ですが、画像の最大値は max = 3.6714e+004 です。

なぜ?1でいいんじゃない?これは正規化の正しい方法ですか?スケーリングを適用するにはどうすればよいですか? 私はそれをする必要がありますか?

正規化コードは次のとおりです。

%%%%%%%%%%%%%%Find Min and Max between the results%%%%%%%%%%%%%%%%%%%%%%% 
pre_max = max(filtImag1{1}(:));
for i=1:10
   new_max = max(filtImag1{i}(:));
    if (pre_max<new_max)
        pre_max=max(filtImag1{i}(:));
    end
end
new_max = pre_max;

pre_min = min(filtImag1{1}(:));
for i=1:10
   new_min = min(filtImag1{i}(:));
    if (pre_min>new_min)
        pre_min = min(filtImag1{i}(:));
    end
end
new_min = pre_min;

%%%%%%%%%%%%%%normalization %%%%%%%%%%%%%%%%%%%%%%%
 for i=1:10
 temp_imag = filtImag1{i}(:,:);
 x=isnan(temp_imag);
 temp_imag(x)=0;
 t_max = max(max(temp_imag));
 t_min = min(min(temp_imag));
 temp_imag = (double(temp_imag-t_min)).*((double(new_max)-double(new_min))/double(t_max-t_min))+(double(new_min));
 imag_test2{i}(:,:) = temp_imag;
 end

編集 提案された回答に基づいてコードを変更しましたが、結果は黒い画像です

%それらの間の最大値と最小値を見つけます pre_max = max(sTStack{1}(:)); for i=1:40 newMax = max(sTStack{i}(:)); if (pre_max

pre_min = min(sTStack{1}(:)); for i=1:40 newMin = min(sTStack{i}(:)); if (pre_min>newMin) pre_min = min(sTStack{i}(:)); 終了終了t_min = pre_min;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%

i=1:40 の場合 NTstack{i} = (sTStack{i} - t_min)/(t_max-t_min); 終わり

for i=10:10:40 figure,imshow(NTstack{i}); カラーバー カラーマップ ジェットエンド

4

3 に答える 3

7

あなたが提供するウィキペディアのスニペットは正しく、次の MATLAB コードを使用して画像を正規化するために使用できます。

%% Create an Example Image:
rand('seed', 1982);
n = 16;
myImg= rand(n,n)*.2 + .5;

%% Normalize the Image:
myRange = getrangefromclass(myImg(1));
newMax = myRange(2);
newMin = myRange(1);

myImgNorm = (myImg - min(myImg(:)))*(newMax - newMin)/(max(myImg(:)) - min(myImg(:))) + newMin;

一部の画像の問題は、可能な値の狭い範囲しか占めていないことです。値の範囲が 0 から 1 の場合、黒は 0 になり、白は 1 になります。ただし、画像の最も暗いスポットが .5 で、最も明るいスポットが .7 の場合、処理またはが可視化されている場合のユーザー (MATLAB の imagesc は、まさにこの理由で、表示前に画像を自動的に正規化することに注意してください)。

hist(myImg(:)) を使用して画像のヒストグラムを見ると、画像が実際に使用している許可された値の必要性がわかります。正規化された画像では、最小値は 0 になり、最大値は 1 (または使用する任意の範囲) になります。

この方程式を実装する際の一般的なエラーは、括弧を適切に配置しない、スケーリングする前に画像の最小値を減算しない、または「newMin」に追加しないことです。

次のコードと画像ですべてをまとめて確認できます。元の画像 (1) がスペースのごく一部しか使用していないことに注意してください (2)。ただし、正規化すると (3)、画像には非常に暗い値と非常に明るい値の両方が含まれ、ヒストグラムは 0 から 1 まで伸びます (4)。コードが何を行っているか、何を行っていないかは明確ではありませんが、この例と比較すると問題が解決するはずです。

%% Create an Example Image:
rand('seed', 1982);
n = 16;
myImg= rand(n,n)*.2 + .5;

%% Normalize the Image:
myRange = getrangefromclass(myImg(1));
newMax = myRange(2);
newMin = myRange(1);

myImgNorm = (myImg - min(myImg(:)))*(newMax - newMin)/(max(myImg(:)) - min(myImg(:))) + newMin;

%% Display the Image:
figure(42);
clf;

% Display the original:
subplot(2,2,1);
imagesc(myImg);
set(gca, 'clim', [0,1]);;
title('(1) Original Image');

% Display the hist of the original:
subplot(2,2,3);
hist(myImg(:))
xlim([0,1]);
title('(2) Histogram Of Original Image');

% Display the normalized image:
subplot(2,2,2);
imagesc(myImgNorm);
title('(3) Normalized Image');

% Display the hist of the normalized image:
subplot(2,2,4);
hist(myImgNorm(:))
title('(4) Histogram of Normalized Image');
xlim([0,1]);

colormap gray

ここに画像の説明を入力

編集:

さらに、 getrangefromclass(...) が問題に対してどのように機能するかについて、注意すべき重要な点がいくつかあります。この関数は、「そのクラスに基づいた画像の既定の表示範囲」を返します。つまり、MATLAB が考える妥当な値の範囲は、そのデータ型が画像を表すためのものです。uint8 データの場合、これは [0, 255] です。int16 の場合、これは [-32768, 32767] です。double の場合、範囲は [0, 1] です。これは最小値と最大値であるためではなく、それが従来のものであり、double データ型にはこの範囲を非常に合理的なものにする特別な表現があるためです。範囲は実際のデータとは関係がないことに注意してください. データが小さい場合、または最小値と最大値よりも大きい場合、MATLAB が画像に適していると考えるものとはかなり異なります。double または single の場合、値ははるかに大きくなる可能性があります。値を [0, 1] の間で正規化するには、これまで説明してきたコードを使用できます。

この場合、大きな正と負の値を持つランダムな画像を作成しますが、それらすべてを 0 から 1 の間にスケーリングします。つまり、最も暗い色を 0 に、明るい色を 1 にします。これまで、最小の色は負の数千、最大の色は正の数千でした。ただし、x 軸の値が 0,1 に変化しても、ヒストグラムの形状は同じままであることに注意してください。これは、MATLAB の範囲が [0,1] であるが、最小値/最大値が異なる理由を示しているはずです。これは問題なく、正規化コードは 0 から 1 の間のすべてを修正します。

randn('seed', 1982);
myImg = randn(n,n)*1000;
% Normalize the Image:
myRange = getrangefromclass(myImg(1));
newMax = myRange(2);
newMin = myRange(1);

myImgNorm = (myImg - min(myImg(:)))*(newMax - newMin)/(max(myImg(:)) - min(myImg(:))) + newMin;

% Display the Image:
figure(42);
clf;

% Display the original:
subplot(2,2,1);
imagesc(myImg);
% set(gca, 'clim', [0,1]);;
title('(1) Original Image');
colorbar
% Display the hist of the original:
subplot(2,2,3);
hist(myImg(:))
title('(2) Histogram Of Original Image');
axis tight;

% Display the normalized image:
subplot(2,2,2);
imagesc(myImgNorm);
title('(3) Normalized Image');
colorbar

% Display the hist of the normalized image:
subplot(2,2,4);
hist(myImgNorm(:))
title('(4) Histogram of Normalized Image');
axis tight;

colormap gray

ここに画像の説明を入力

于 2012-06-24T18:36:57.563 に答える
3

前の質問に答えたので、あなたの混乱は理解できたと思います。

まず第一に、入力画像は型uint8(したがって範囲 [0,255]) であり、信号に対して処理 (バターワース フィルタリング) を実行する必要があったdoubleため、値が切り捨てられないようにデータ型に変換する必要がありました。

処理の最後に、結果の「画像」はタイプのものdoubleでしたが、任意の範囲を持っていました(信号の平均エネルギーを表していました)。これらのイメージを表示したり、イメージ処理を実行したりする場合 (元のコードで適用しようとしていた場合medfilt2)、MATLAB はイメージのタイプdoubleが [0,1] の範囲にあると想定します。

コードで使用した式とあなたが提供した式は互換性があります。[0,1] の範囲に正規化しているだけなのでnewMax = 1newMin = 0式は前に説明したように単純になります。

 img = ( img - min(img(:)) ) ./ ( max(img(:)) - min(img(:)) );

各画像を独自に正規化する必要があることを覚えておいてください。つまり、画像のグループ全体からではなく、画像自体の式で最小/最大を計算します。私が提案したソリューションを振り返ってみると、画像はセル配列に格納され、CELLFUN を使用して計算が行われ、各画像の最小値/最大値が個別に取得されました。

Tf = cellfun(@(x)reshape((x-min(x))./range(x),sz), Tf, 'Uniform',false);

明らかに、信号は線形化されたベクトル (それぞれがセル内) として保存されていたため、それぞれを [0,1] の範囲に正規化し、適切な画像マトリックスに再形成しました。

uint8その後、画像に戻りたい場合は、単純な呼び出しでim2uint8十分です。

上記で実行した線形変換のタイプは最小/最大正規化と呼ばれることを付け加えておきますが、これが唯一の種類ではないことは確かです (他の例については、この回答を参照してください)。他のコントラスト強調技術を調べることもできます (ヒストグラムの均等化などを考えください) 。

于 2012-06-24T19:46:35.250 に答える
2

私は通常mat2gray、これらの目的のために画像処理ツールボックスから使用します: mat2gray . 上記とまったく同じ線形補間を適用します。内部的にはimlincombを呼び出します。

あなたが言及している問題は、あなたが何らかの形で上記の方程式を間違って実装したと私に思わせます。

于 2012-06-24T18:29:53.263 に答える