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

<think>好的,我需要回答用户关于图像归一化处理方法或实现方式的问题。首先,我得先理解图像归一化的基本概念和作用。根据用户提供的引用内容,图像归一化主要是为了抵抗几何变换的影响,找出图像中的不变量,同时用于去噪等处理。用户还提到了均值归零和标准化处理,以及具体的Python代码示例。 接下来,我需要整理图像归一化的常见处理步骤。根据引用[3],归一化的一种方法是计算均值并减去均值,使其均值为0。而引用[4]中的代码展示了如何用SimpleITK库读取图像,计算均值和标准差,并进行标准化处理。这里可能涉及到两种方法:均值归零和标准化(减均值除以标准差)。需要区分这两种方法,并说明它们的应用场景。 然后,我需要考虑用户提到的不同引用内容如何整合到回答中。比如,引用[1]和[2]提到了归一化的目的和去噪方法,而引用[3]和[4]提供了具体的数学公式和代码实现。因此,在回答中需要涵盖定义、常见方法(如线性归一化、均值标准化、Z-Score标准化)、实现步骤,以及具体的代码示例。 另外,用户的问题是关于“处理方法或实现方式”,因此重点应放在步骤和实现上,同时简要提及目的和应用场景。需要确保每个步骤都有对应的引用支持,比如引用[3]的均值和公式,引用[4]的代码实现,引用[1]的应用场景等。 还要注意用户提到的系统级指令,比如使用中文回答,正确使用LaTeX格式,生成相关问题等。在数学公式部分,如均值归零的公式需要用$...$包裹,例如$\text{归一化后的值} = \text{原始值} - \text{均值}$。独立公式如标准化公式可能需要单独成段使用$$...$$。 最后,生成的相关问题需要与图像归一化相关,可能包括不同方法的比较、应用场景、实际工具的使用等。需要确保问题覆盖用户可能感兴趣的方面,并参考已有的引用内容。 现在需要检查是否有遗漏的信息,比如引用[2]提到的平滑处理,虽然属于图像处理的一部分,但可能和归一化有关联,可以适当提及。同时确保代码示例的正确性,如引用[4]中的代码是否正确处理了归一化,是否需要进一步解释。 总结回答结构:定义和作用、常见方法(分点说明)、实现步骤(可能结合代码)、代码示例,最后相关问题。确保每个部分引用正确的来源,并自然添加引用标识。</think>### 图像归一化处理方法及实现 图像归一化图像预处理的关键步骤,旨在消除数据量纲差异、增强特征一致性,并提升模型鲁棒性。以下是具体方法及实现方式: --- #### 一、图像归一化的作用 1. **抵抗几何变换**:通过提取图像不变量,识别同一系列图像[^1]。 2. **去噪与平滑**:通过滤波器减少高频噪声,模糊图像以保留低频特征[^2]。 3. **数据标准化**:统一像素分布,加速模型训练收敛[^3]。 --- #### 二、常见归一化方法 1. **线性归一化(Min-Max Scaling)** 将像素值映射到$[0,1]$区间: $$x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}$$ 适用于像素分布范围已知的情况。 2. **均值归零(Mean Centering)** 计算图像均值$\mu$,使数据以原点为中心: $$x_{\text{norm}} = x - \mu$$ 常用于消除光照差异。 3. **Z-Score标准化** 利用均值$\mu$和标准差$\sigma$进行标准化: $$x_{\text{norm}} = \frac{x - \mu}{\sigma}$$ 适用于数据分布近似正态的场景[^4]。 --- #### 三、实现步骤(以Z-Score为例) 1. **读取图像数据**:使用库(如OpenCV、SimpleITK)加载图像。 2. **计算统计量**:求取像素均值$\mu$和标准差$\sigma$。 3. **标准化处理**:对每个像素应用公式$(x - \mu)/\sigma$。 4. **保存结果**:保留图像元数据(如原点、方向)后输出[^4]。 --- #### 四、代码示例(SimpleITK实现) ```python import SimpleITK as sitk import os # 读取图像 image = sitk.ReadImage(imagepath) img_arr = sitk.GetArrayFromImage(image) # 计算均值和标准差 mean = img_arr.mean() std = img_arr.std() # 标准化处理 new_arr = (img_arr - mean) / std # 保存结果 res = sitk.GetImageFromArray(new_arr) res.SetOrigin(image.GetOrigin()) # 保留原始空间信息 res.SetSpacing(image.GetSpacing()) sitk.WriteImage(res, outputpath) ``` 此代码通过标准化使数据均值为0、标准差为1。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值