0

一連の画像を分析する必要があり、実行する必要がある操作は次のとおりです。

  1. 別の画像セット (コードではオープン ビームと呼ばれます) を合計し、中央値を計算して 90 度回転させます。
  2. ファイル「list.txt」にリストされている一連の画像をロードします。
  3. 画像は3つのグループで収集されました。各グループについて、強度値が特定のしきい値を超える画像中央値の3倍であり、それ以外の場合は強度値の合計に等しい画像を生成したいと考えています。
  4. 3 つの画像の各グループについて、結合された画像 (3. で計算) からオープン ビームの中央値 (1. で計算) を減算します。

上記のプロセスを使用して生成された tif の 1 つを考慮すると、最大値は 65211 であり、対応するグループの 3 つの画像の中央値の 3 倍ではありません (ピクセル位置を考慮して確認しました)。なぜこれが起こるのか、どうすれば修正できるのかについて何か提案はありますか?

コードは以下に報告されています。ありがとう!

%Here we calculate the average for the open beam
clear;
j = 0;
for i=1:5
   s = sprintf('/Users/Alberto/Desktop/Midi/17_OB_2.75/midi_%04i.fits',i);
   j = j+1;
   A(j,:,:) = uint16(fitsread(s));
end

OB_median = median(A,1);
OB_median = squeeze(OB_median);
OB_median_rot=rot90(OB_median);

%Here we calculate, for each projection, the average value from the three datasets

%Read list of images from text file
fid = fopen('/Users/Alberto/Desktop/Midi/list.txt', 'r');
a = textscan(fid, '%s');
fclose(fid);

%load images
j = 0;
for i = 1:1:42 %556 entries; 543 valid values
      s = sprintf('/Users/Alberto/Desktop/Midi/%s',a{1,1}{i,1});
      j = j+1;
      A(j,:,:) = uint16(fitsread(s));
end

threshold = 80 %This is a discretional number. I put it after noticing 
%that we get the same number of pixels with a value >100 if we use 80 or 50.

k = 0;
for ii = 1:3:42
    N(1,:,:) = A(ii,:,:);
    N(2,:,:) = A(ii+1,:,:);
    N(3,:,:) = A(ii+2,:,:);
    median_N = median(N,1);
    median_N = squeeze(median_N); 
    B(:,:) = zeros(2160,2592);
    for i = 1:1:2160
        for j = 1:1:2592
            RMS(i,j) = sqrt((double(N(1,i,j).^2) + double(N(2,i,j).^2) + double(N(3,i,j).^2))/3);
            if RMS(i,j) > threshold
               %B(i,j) = 30;
               B(i,j) = 3*median_N(i,j);
            else
               B(i,j) = A(ii,i,j) + A(ii+1,i,j) + A(ii+2,i,j);
               %B(i,j) = A(ii,i,j);
            end
        end
    end
    k = k+1;
    filename = sprintf('/Users/Alberto/Desktop/Midi/Edited_images/Despeckled_images/despeckled_image_%03i.tif',k);
    %Now we rotate the matrix
    B_rot=rot90(B);
    imwrite(B_rot, filename);
    %imwrite(uint16(B_rot), filename);
    %Now we subtract the OB median
    B_final_rot = double(B_rot) - 3*double(OB_median_rot);
    filename = sprintf('/Users/Alberto/Desktop/Midi/Edited_images/Final_image/final_image_%03i.tif',k);
    imwrite(uint16(B_final_rot), filename);
end
4

1 に答える 1

1

uint16データ型で表現できる最大の整数は

>> a=100000; uint16(a)

ans =

  65535

この制限を回避するには、 として保存する前に、データを型として再スケーリングし、範囲 (画像のコントラスト) を調整して、データ型doubleによって課される制限に一致させる必要があります。uint16uint16

于 2013-10-17T13:05:11.123 に答える