itk中的特征提取算法(三)

来源:互联网 发布:php简历管理系统 编辑:程序博客网 时间:2024/05/18 00:46
在图像处理过程中,目标物体给我们最直观的信息,除了形状,可能就是灰度了(抱歉,由于总是和医学图像相关,这里只讨论灰度图像,暂时不关注RGB)。本文要实现的目标是提取图像中灰度最大的点和最小的点。
itk给我们提供的类叫做:itkMinimumMaximumImageCalculator。看类名就知道,itk中的最大值最小值图像计算器。该计算器计算图像的最大值和最小值。类的设计依赖于itk的图像模版。提供了3个计算函数:
1.ComputeMaximum():计算最大值
2.ComputeMinimum():计算最小值
3.Compute():计算最大值和最小值

0..h中的私有成员变量:
  PixelType            m_Minimum;//最大点灰度值  PixelType            m_Maximum;//最小点灰度值  ImageConstPointer    m_Image;//图像容器  IndexType            m_IndexOfMinimum;//最大点坐标点  IndexType            m_IndexOfMaximum;//最小点坐标点  RegionType           m_Region;//算法执行de区域空间  bool                 m_RegionSetByUser;//自动/手动 区域空间标志位

1.构造函数:
template<class TInputImage>//itk模版MinimumMaximumImageCalculator<TInputImage>::MinimumMaximumImageCalculator(){  m_Image = TInputImage::New();//初始化输入图像内存空间//注意以下两句,比较有意思//最大值初始化为一个小数,最小值初始化为一个大数//这样些是不是很规范呢?  m_Maximum = NumericTraits<PixelType>::NonpositiveMin();  m_Minimum = NumericTraits<PixelType>::max();//点坐标矩阵中用0填充  m_IndexOfMinimum.Fill(0);  m_IndexOfMaximum.Fill(0);//默认自动选择区域空间(其实就是整个图像size)  m_RegionSetByUser = false;}
2.Compute方法:
template<class TInputImage>voidMinimumMaximumImageCalculator<TInputImage>::Compute(void){  if( !m_RegionSetByUser )    {    m_Region = m_Image->GetRequestedRegion();    }//ImageRegionConstIteratorWithIndex很重要,迭代器//注意迭代器中的  ImageRegionConstIteratorWithIndex< TInputImage >  it( m_Image, m_Region );//下面两句在初始化中出现过了,我猜是容错处理  m_Maximum = NumericTraits<PixelType>::NonpositiveMin();  m_Minimum = NumericTraits<PixelType>::max();//开始扫描图像矩阵,从第一个点开始,到最后一个点结束  while( !it.IsAtEnd() )    {//获得当前点的灰度值    const PixelType value = it.Get();  //如果比当前的最大值大,交换    if (value > m_Maximum)       {      m_Maximum = value;      m_IndexOfMaximum = it.GetIndex();      }//如果比当前的最小值小,交换    if (value < m_Minimum)       {      m_Minimum = value;      m_IndexOfMinimum = it.GetIndex();      }//继续下一个点    ++it;    }}
3.ComputeMaximum和ComputeMinimum方法都与Compute大同小异,略过。
4.最后一个有用的函数,设置区域:
template<class TInputImage>voidMinimumMaximumImageCalculator<TInputImage>::SetRegion( const RegionType & region ){  m_Region = region;//输入区域  m_RegionSetByUser = true;//如果人工输入,标志位则true}
话说,这个特征点提取是不是太easy了点?
嗯,是的。但要记住,这里主要是分析itk官方源码,功能的实现是其次的。随时都要提醒自己,鱼和渔的区别,不要本末倒置,一叶障目,不见泰山。



原创粉丝点击