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

在图像处理过程中,目标物体给我们最直观的信息,除了形状,可能就是灰度了(抱歉,由于总是和医学图像相关,这里只讨论灰度图像,暂时不关注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>
void
MinimumMaximumImageCalculator<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>
void
MinimumMaximumImageCalculator<TInputImage>
::SetRegion( const RegionType & region )
{
  m_Region = region;//输入区域
  m_RegionSetByUser = true;//如果人工输入,标志位则true
}
话说,这个特征点提取是不是太easy了点?
嗯,是的。但要记住,这里主要是分析itk官方源码,功能的实现是其次的。随时都要提醒自己,鱼和渔的区别,不要本末倒置,一叶障目,不见泰山。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值