在图像处理过程中,目标物体给我们最直观的信息,除了形状,可能就是灰度了(抱歉,由于总是和医学图像相关,这里只讨论灰度图像,暂时不关注RGB)。本文要实现的目标是提取图像中灰度最大的点和最小的点。
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官方源码,功能的实现是其次的。随时都要提醒自己,鱼和渔的区别,不要本末倒置,一叶障目,不见泰山。