天天看點

itk中的圖像歸一化

關于圖像歸一化,直覺一直告訴我是有用的。然而,在實際過程中并沒有發現能起到什麼作用(可能是由于我對數字圖像的了解還是不夠深),先一起了解下理論吧。

itk中的圖像歸一化

(注:文中引号裡的内容都摘自參考文獻,如果侵權,請私信聯系)

“所謂圖像歸一化, 就是通過一系列變換, 将待處理的原始圖像轉換成相應的唯一标準形式(該标準形式圖像對平移、旋轉、縮放等仿射變換具有不變特性)。近年來, 基于矩的圖像歸一化技術受到了人們的普遍關注, 其基本工作原理為: 首先利用圖像中對仿射變換具有不變性的矩來确定變換函數的參數, 然後利用此參數确定的變換函數把原始圖像變換為一個标準形式的圖像(該圖像與仿射變換無關)。  一般說來, 基于矩的圖像歸一化過程包括 4 個步驟 即坐标中心化、x-shearing 歸一化、縮放歸一化和旋轉歸一化。

 注意:

1.歸一化處理并沒有改變圖像的對比度 ;

2.歸一化處理很簡單,假設原圖像是8位灰階圖像,那麼讀入的像素矩陣最大值為256,最小值為1,定義矩陣為I,J=I/256,就是歸一化的圖像矩陣,就是說歸一化之後所有的像素值都在[0,1]區間内。”

“不同的醫學成像因素造成相同性質的組織在圖像灰階資訊上的不一緻。灰階歸一化就是在保留具有診斷價值的灰階差異的同時,減小甚至消除圖像中灰階不一緻而進行的圖像轉換方法,以便計算機自動分析處理。目前常見的算法根據灰階轉換的依據分為基于直方圖的灰階歸一化以及基于圖像内容特征的灰階歸一化兩大類。”

itk中提供的類叫做:itkNormalizeImageFilter

作用:将圖像的均值設為0,方差設為1。

pix_output = ( pix_input  - mean) / sqrt( variance )

typedef itk::NormalizeImageFilter< FloatImageType, FloatImageType >FilterType;
  FilterType::Pointer normalizeFilter = FilterType::New();
  normalizeFilter->SetInput(input_data);
           

依舊是代碼分析: 1.私有變量:該濾波器是通過itkStatisticsImageFilter和itkShiftScaleImageFilter組合變換的

typename StatisticsImageFilter<TInputImage>::Pointer              m_StatisticsFilter;
  typename ShiftScaleImageFilter<TInputImage,TOutputImage>::Pointer m_ShiftScaleFilter;
           

2.資料生成 

template <class TInputImage, class TOutputImage>
void 
NormalizeImageFilter<TInputImage, TOutputImage>
::GenerateData()
{
//以下四行暫時不看,沒什麼用
  ProgressAccumulator::Pointer progress = ProgressAccumulator::New();
  progress->SetMiniPipelineFilter(this);

  progress->RegisterInternalFilter(m_StatisticsFilter,.5f);
  progress->RegisterInternalFilter(m_ShiftScaleFilter,.5f);

  // Gather statistics 通過m_StatisticsFilter擷取圖像現在均值和方差
  
  m_StatisticsFilter->SetInput(this->GetInput());
  m_StatisticsFilter->GetOutput()->SetRequestedRegion(this->GetOutput()->GetRequestedRegion());
  m_StatisticsFilter->Update();

  // Set the parameters for Shift 通過m_ShiftScaleFilter進行變換
  m_ShiftScaleFilter->SetShift(-m_StatisticsFilter->GetMean());//偏移後均值為0
  m_ShiftScaleFilter->SetScale(NumericTraits<ITK_TYPENAME StatisticsImageFilter<TInputImage>::RealType>::One
                               / m_StatisticsFilter->GetSigma());//縮放後方差為1
//注意:
//NumericTraits<ITK_TYPENAME StatisticsImageFilter<TInputImage>::RealType>::One
//這麼長的一段,其實就是最後一個單詞有用:1
  m_ShiftScaleFilter->SetInput(this->GetInput());
  
  m_ShiftScaleFilter->GetOutput()->SetRequestedRegion(this->GetOutput()->GetRequestedRegion());
  m_ShiftScaleFilter->Update();

  // Graft the mini pipeline output to this filters output
  this->GraftOutput(m_ShiftScaleFilter->GetOutput());
}
           

itkShiftScaleImageFilter:對圖像的灰階值線性變換,偏移量和縮放比例由使用者指定。

pix_output = (pix_input + shift) * scale

SetShift():偏移量

SetScale():縮放比例 今天代碼不多,下面貼一個網友關于圖像歸一化的demo: “ 資料歸一化的作用還是挺大的,最起碼在不同特征向量融合方面,資料歸一化是計算相似度距離上比不可少的一部分。試想一下,如果不對資料進行歸一化,則不同特征向量怎麼賦予一個合理的權重,隻有當每個特征向量都處于一個級别上,賦予合理的權重才有意義。 給大家舉個例子吧。如下圖是以:

itk中的圖像歸一化

如果現在需要比較樣本二與樣本一、樣本三哪個最相似?為簡單起見我們使用歐式距離。  

 樣本二與樣本一的相似度:99*99+0*0+0*0+0*0=99*99; 

 樣本二與樣本三的相似度:0*0+1*1+1*1=2; 

 很顯然樣本二與樣本三最為相似。  如果我們對資料進行線性歸一化到[0,1],則歸一化後的資料為

itk中的圖像歸一化

 樣本二與樣本一的相似度:1*1+0*0+0*0+0*0=1; 

 樣本二與樣本三的相似度:0*0+1*1+1*1=2; 

 很顯然樣本二與樣本一最為相似。 

其實最終結果應該是樣本二與樣本一最為相似,上述的這種資料歸一化我們将它稱為特征向量内部歸一化。

很顯然有内部歸一化就有外部歸一化。這兩者的差別在于歸一化的對象。内部歸一化對于其中特定的某一維特征向量進行歸一化,外部歸一化則是對于每個樣本的N維特征向量進行歸一化。 

内部歸一化:一般使用的方法為:高斯歸一化; 

外部歸一化:有線性縮放到機關區間、線性縮放到機關方差、變換為[0,1]上均勻分布的随機變量、排序歸一化。”

-----摘自百度文庫中《圖像進行中特征向量的歸一化》

itk中的圖像歸一化

冥冥之中,萬事皆有因果。君子之道,謹言慎行。

參考文獻: 1.http://blog.csdn.net/u013294888/article/details/71105251 2.百度文庫中的《圖像進行中特征向量的歸一化》 3.http://blog.csdn.net/u010555688/article/details/25551255