【ITK库学习】使用itk库对图像进行Binary(二值)形态学处理:开操作、闭操作

1、itkBinaryMorphologicalOpeningImageFilter 开操作

该Filter的功能:用于去除图像内部或边界处的小(即小于结构元素)结构。
开操作的形态学定义为:先对图像进行腐蚀,再对图像进行膨胀

假定输入数据由二进制值(0或1)组成,结构元素中只有值 > 0的元素才可以影响目标像素。

常用的成员函数

  • SetInput():设置输入的图像数据
  • SetKernel():设置作用于图像的结构元素
  • Set/GetBackgroundValue():设置/获取图像腐蚀部分的值, 默认为零
  • Set/GetForegroundValue():设置/获取图像中的“前景”的值, 默认为InputPixelType的最大值
  • Update():更新

2、itkBinaryMorphologicalClosingImageFilter 闭操作

该Filter的功能:去除图像内部或边界处的小孔(即小于结构元素)和管状结构。
开操作的形态学定义为:先对图像进行膨胀,再对图像进行腐蚀

假定结构元素由二进制值(0或1)组成,结构元素中只有值 > 0的元素才可以影响目标像素。

常用的成员函数

  • SetInput():设置输入的图像数据
  • SetKernel():设置作用于图像的结构元素
  • Set/GetSafeBorder():设置/获取输入图像中的安全边框(安全边框:避免边框效果),并在闭操作完成后删除
  • Set/GetForegroundValue():设置/获取图像中的“前景”的值。 默认为InputPixelType的最大值
  • Update():更新

3、扩展:itkBinaryBallStructuringElement

表示具有二进制元素(0或1)的球结构(椭圆体)的邻域。

此类定义了一个 Neighborhood,其元素关闭或打开取决于它们是在半径与 Neighborhood半径匹配的椭球体外部还是内部,该类可用作形态图像过滤器的结构元素。

BinaryBallStructuringElement 具有N维半径。 每个维度的半径分别定义为邻域从中心像素向外延伸的像素数,例如,半径为 2x3 的 二维2D BinaryBallStructuringElement 对象的边长为 5x7。

BinaryBallStructuringElement对象始终具有明确的中心,因此它的边长始终是奇数,边长=半径*2+1;

在内部,最好使用FlatStructuringElement执行其所有计算,因为 FlatStructuringElement 更灵活。

  • SetRadius():设置结构体半径
  • CreateStructuringElement():构建结构元素

4、扩展:itkSubtractImageFilter

两个图像的逐像素减法,即将image2中的每个像素从image1中对应的像素中减去:
Output = Input1 - Input2
由于昨晚二值形态学的图像像素值只有0或1,要恢复原图灰度可以用该类进行处理

5、代码示例:

#include "itkImage.h"
#include "itkBinaryMorphologicalOpeningImageFilter.h"
#include "itkBinaryMorphologicalClosingImageFilter.h"
#include "itkBinaryBallStructuringElement.h"
#include "itkSubtractImageFilter.h"
 
const unsigned int  Dimension= 3;       //数据的Dimension
typedef signed short shortPixelType;   
typedef itk::Image<shortPixelType, Dimension> ShortImageType;
	
bool morphologyFilter(ShortImageType* image, int radius)
{
	typedef BinaryBallStructuringElement<short, Dimension> BSEType;
	typedef SubtractImageFilter<ShortImageType> SubImgFilter;
	
    //开操作
    typedef BinaryMorphologicalOpeningImageFilter<ShortImageType, ShortImageType, SEType> BOpenFilterType;
    //闭操作
    typedef BinaryMorphologicalClosingImageFilter<ShortImageType, ShortImageType, SEType> BCloseFilteType;
   
    BSEType ballStrEle;
    //unsigned int radius = 3;      //半径为3,直径为7
    ballStrEle.SetRadius(radius);
    ballStrEle.CreateStructuringElement();

   //开操作代码
   typename BOpenFilterType::Pointer openFilter = BOpenFilterType::New();
   //auto openFilter = BOpenFilterType::New();
   openFilter->SetInput(image);
   openFilter->SetKernel(ballStrEle);
   try
	{
	    openFilter->Update();
	}
	catch(itk::ExceptionObject& ex)
	{
	    //读取过程发生错误
        std::cerr << "Error: " << ex << std::endl;
        return false;
	}
	
	//闭操作代码
   typename BCloseFilteType::Pointer closeFilter = BCloseFilteType::New();
   //auto closeFilter = BOpenFilterType::New();
   closeFilter->SetInput(image);
   closeFilter->SetKernel(ballStrEle);
   try
	{
	    closeFilter->Update();
	}
	catch(itk::ExceptionObject& ex)
	{
	    //读取过程发生错误
        std::cerr << "Error: " << ex << std::endl;
        return false;
	}
	
    SubImgFilter::Pointer diffImg = SubImgFilter::New();
    //auto diffImg = SubImgFilter::New();
    diffImg->SetInput1(image);
    diffImg->SetInput2(openFilter->GetOutput());
    //diffImg->SetInput2(closeFilter->GetOutput());
    
    return true;
}



  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值