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:
“ 数据归一化的作用还是挺大的,最起码在不同特征向量融合方面,数据归一化是计算相似度距离上比不可少的一部分。试想一下,如果不对数据进行归一化,则不同特征向量怎么赋予一个合理的权重,只有当每个特征向量都处于一个级别上,赋予合理的权重才有意义。
给大家举个例子吧。如下图所以:

如果现在需要比较样本二与样本一、样本三哪个最相似?为简单起见我们使用欧式距离。  
 样本二与样本一的相似度:99*99+0*0+0*0+0*0=99*99; 
 样本二与样本三的相似度:0*0+1*1+1*1=2; 
 很显然样本二与样本三最为相似。  如果我们对数据进行线性归一化到[0,1],则归一化后的数据为

 样本二与样本一的相似度:1*1+0*0+0*0+0*0=1; 
 样本二与样本三的相似度:0*0+1*1+1*1=2; 
 很显然样本二与样本一最为相似。 
其实最终结果应该是样本二与样本一最为相似,上述的这种数据归一化我们将它称为特征向量内部归一化。
很显然有内部归一化就有外部归一化。这两者的区别在于归一化的对象。内部归一化对于其中特定的某一维特征向量进行归一化,外部归一化则是对于每个样本的N维特征向量进行归一化。 
内部归一化:一般使用的方法为:高斯归一化; 
外部归一化:有线性缩放到单位区间、线性缩放到单位方差、变换为[0,1]上均匀分布的随机变量、排序归一化。”

-----摘自百度文库中《图像处理中特征向量的归一化

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

参考文献:
1.http://blog.youkuaiyun.com/u013294888/article/details/71105251
2.百度文库中的《图像处理中特征向量的归一化》
3.http://blog.youkuaiyun.com/u010555688/article/details/25551255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值