2013-10-17 57 views
0

我來分析一組圖像,而這些都是我需要執行如下操作:圖片操縱 - 強度和TIF圖像

  1. 總和另一組圖像(稱爲開放光束中的代碼) ,計算中位數並旋轉90度;
  2. 加載一組圖像,列在文件「list.txt」中;
  3. 圖像已被收集在一組3組。對於每個組,我想要生成的圖像的強度值是圖像中位數高於某個閾值的3倍,否則等於強度值的總和;
  4. 對於每組三個圖像,減去從所述合成圖像(在3計算)

考慮TIFS之一的開放光束中位數(在1計算)使用上述方法生產的,我最大值是65211,這不是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 

回答

1

可由uint16數據類型來表示的最大整數是

>> a=100000; uint16(a) 

ans = 

    65535 

爲了克服這種限制就需要重新調整數據作爲double類型和調整範圍(圖像對比度),以同意保存爲uint16之前的uint16數據類型施加的限制。