ITK07 掩膜处理

 掩膜处理

  • 获取目标图像尺寸
  • 利用尺寸创建新图像
  • 两个图像原点、间距等指标保持一致
  • 对新图像赋值(保留区域赋1,遮掩区域赋0)
  • 两个图像做乘法,提取感兴趣区域
        ITK 中关于图像的一个重要概念是区域 regions ,它是一个矩形的、连续的图像块。区域用来指定图像中处理的部分,例如多线程或保留在内存中的部分。在 ITK 中有三种常用的区域类型:
(1)LargestPossibleRegion ——全部图像。
(2) BufferedRegion ——保留在内存中的图像部分。
(3) RequestedRegion ——对图像操作时滤波器或其他类需要的部分。   


参考:ITK 基本数学运算https://blog.csdn.net/weixin_38293453/article/details/115207604

参考:ITK 图像取反https://blog.csdn.net/rabbitbride/article/details/82422568

//创建掩膜
//010
//reader-intensityWindowing-thresholder-(StructuringElement)-Dilate-Erode-writer

#include "itkImageFileReader.h"//读取头文件
#include "itkImageFileWriter.h"//写入头文件
#include "itkGDCMImageIO.h"//ImageIo头文件
#include "itkIntensityWindowingImageFilter.h"//调窗处理头文件
#include "itkBinaryThresholdImageFilter.h"//二值门限处理头文件
#include "itkBinaryBallStructuringElement.h"//基本球形
#include "itkBinaryErodeImageFilter.h"//腐蚀头文件
#include "itkBinaryDilateImageFilter.h"//膨胀头文件
#include "itkGrayscaleFillholeImageFilter.h"//灰度图像孔洞填充
#include "itkRescaleIntensityImageFilter.h"//像素值映射头文件
#include "itkGradientMagnitudeImageFilter.h"//梯度强度头文件
#include "itkMultiplyImageFilter.h"

int main(int argc, char* argv[])
{
    typedef  signed short  PixelType; // signed short 数据类型
    typedef itk::Image< PixelType, 2 >   ImageType;//image类型

    typedef itk::ImageFileReader< ImageType >  ReaderType;
    typedef itk::ImageFileWriter< ImageType >  WriterType;
    ReaderType::Pointer reader = ReaderType::New();//reader
    WriterType::Pointer writer = WriterType::New();//writer

    typedef itk::GDCMImageIO ImageIOType;
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();//gdcmImageIO

    reader->SetFileName("D:/leg_dcm/IM80.dcm");//读取文件
    reader->SetImageIO(gdcmImageIO);
    reader->Update();

    //调窗处理
    typedef itk::IntensityWindowingImageFilter<ImageType, ImageType >  IntensityFilterType;
    IntensityFilterType::Pointer intensityWindowing = IntensityFilterType::New();
    intensityWindowing->SetWindowMinimum(124);//最小窗值
    intensityWindowing->SetWindowMaximum(126);//最大窗值
    intensityWindowing->SetOutputMinimum(0);//
    intensityWindowing->SetOutputMaximum(255); // 
    intensityWindowing->SetInput(reader->GetOutput());//
    intensityWindowing->Update();

    //二值门限
    typedef itk::BinaryThresholdImageFilter<ImageType, ImageType > ThresholdingFilterType;
    ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
    thresholder->SetInput(intensityWindowing->GetOutput());
    thresholder->SetUpperThreshold(255);//上下阈值参数设定
    thresholder->SetLowerThreshold(250);
    thresholder->SetOutsideValue(0);//输出值设定,背景为0,前景为255
    thresholder->SetInsideValue(255);
    thresholder->Update();

    //用于二值图像的构造成员
    typedef itk::BinaryBallStructuringElement< PixelType, 2  > StructuringElementType;
    StructuringElementType  structuringElement;
    structuringElement.SetRadius(1);   //领域大小为3*3
    structuringElement.CreateStructuringElement();

    //开运算:先膨胀再腐蚀
    typedef itk::BinaryErodeImageFilter <ImageType, ImageType, StructuringElementType >  ErodeFilterType;// 腐蚀,需要用输入、输出图像类型和构造成员实例化
    typedef itk::BinaryDilateImageFilter <ImageType, ImageType, StructuringElementType >  DilateFilterType;// 膨胀,需要用输入、输出图像类型和构造成员实例化

    DilateFilterType::Pointer binaryDilate = DilateFilterType::New();
    binaryDilate->SetInput(thresholder->GetOutput());
    binaryDilate->SetKernel(structuringElement);
    binaryDilate->SetDilateValue(255);
    binaryDilate->Update();

    ErodeFilterType::Pointer  binaryErode = ErodeFilterType::New();
    binaryErode->SetInput(binaryDilate->GetOutput());
    binaryErode->SetKernel(structuringElement);
    binaryErode->SetErodeValue(255);
    binaryErode->Update();

    //闭运算:先腐蚀再膨胀
    ErodeFilterType::Pointer  binaryErode1 = ErodeFilterType::New();
    binaryErode1->SetInput(binaryErode->GetOutput());
    binaryErode1->SetKernel(structuringElement);
    binaryErode1->SetErodeValue(255);
    binaryErode1->Update();

    DilateFilterType::Pointer binaryDilate1 = DilateFilterType::New();
    binaryDilate1->SetInput(binaryErode1->GetOutput());
    binaryDilate1->SetKernel(structuringElement);
    binaryDilate1->SetDilateValue(255);
    binaryDilate1->Update();

    //二值门限处理
    typedef itk::BinaryThresholdImageFilter<ImageType, ImageType > ThresholdingFilterType;
    ThresholdingFilterType::Pointer thresholder1 = ThresholdingFilterType::New();
    thresholder1->SetInput(binaryDilate1->GetOutput());
    thresholder1->SetUpperThreshold(255);//上下阈值参数设定
    thresholder1->SetLowerThreshold(250);
    thresholder1->SetOutsideValue(0);//输出值设定,背景为0,前景为255
    thresholder1->SetInsideValue(255);
    thresholder1->Update();

    //孔洞填充(灰度图像)
    typedef itk::GrayscaleFillholeImageFilter<ImageType, ImageType> FillHoleType;
    FillHoleType::Pointer fillHoleFilter = FillHoleType::New();
    fillHoleFilter->SetInput(thresholder1->GetOutput());
    fillHoleFilter->Update();

    //梯度强度
    typedef itk::GradientMagnitudeImageFilter< ImageType, ImageType >  FilterType;
    FilterType::Pointer gradfilter = FilterType::New();
    gradfilter->SetInput(fillHoleFilter->GetOutput());
    gradfilter->Update();

    typedef itk::RescaleIntensityImageFilter< ImageType, ImageType > RescaleFilterType;
    RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
    rescaler->SetInput(gradfilter->GetOutput());
    rescaler->SetOutputMinimum(0);
    rescaler->SetOutputMaximum(255);
    rescaler->Update();

    //获取图像尺寸
    ImageType::Pointer image = rescaler->GetOutput();
    ImageType::RegionType region = image->GetLargestPossibleRegion();//获取全部图像
    ImageType::SizeType size = region.GetSize();//获取尺寸
    std::cout << size << std::endl;//打印目标图像尺寸
    std::cout << size[0] << std::endl;//打印目标图像x方向尺寸
    std::cout << size[1] << std::endl;//打印目标图像y方向尺寸

    //创建掩膜
    //using ImageType = itk::Image<signed short, 2>;
    ImageType::Pointer image1 = ImageType::New();//创建新图像

    ImageType::IndexType start; //创建itk::Index对象,用来指定图像起点位置
    start[0] = 0;
    start[1] = 0;
    ImageType::SizeType size1;   //创建itk::Size对象,指定图像各方向大小
    size1[0] = size[0];
    size1[1] = size[1];
    ImageType::RegionType region1; //创建图像区域,并设置起点和大小
    region1.SetSize(size1);
    region1.SetIndex(start);
    image1->SetRegions(region1);
    ImageType::SpacingType spacing;  //定义像素间距
    spacing[0] = 0.589844;
    spacing[1] = 0.589844;
    image1->SetSpacing(spacing);
    ImageType::PointType origin;     //定义像素原点
    origin[0] = -151;
    origin[1] = -151;
    image1->SetOrigin(origin);
    image1->Allocate();   //分配内存
    image1->FillBuffer(itk::NumericTraits<signed short>::Zero); //初始化图像缓冲区
    for (int i = 0; i < size1[0]; i++) //像素所在行
    {
        start[0] = i;
        for (int j = 0; j < size1[1]/100*85; j++) //像素所在列
        {
            start[1] = j;
            image1->SetPixel(start, 1);  //给指定位置设置像素值

        }
        for (int j = size1[1] / 100 * 85; j < size1[1]; j++) //像素所在列
        {
            start[1] = j;
            image1->SetPixel(start, 0);  //给指定位置设置像素值

        }
    }
    
    //掩膜处理
    typedef itk::MultiplyImageFilter<ImageType, ImageType, ImageType>FilterType1;
    FilterType1::Pointer multfilter = FilterType1::New();
    multfilter->SetInput1(image);//两个输入图像
    multfilter->SetInput2(image1);
     try
    {
         multfilter->Update();
    }
    catch (itk::ExceptionObject& excep)
    {
        std::cerr << "Exception caught !" << std::endl;
        std::cerr << excep << std::endl;
        std::cout << "succed " << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }


    writer->SetInput(multfilter->GetOutput());
    writer->SetFileName("D:/080.dcm");
    writer->SetImageIO(gdcmImageIO);
    writer->Update();



    return EXIT_SUCCESS;
}
//try
//{
//    thresholder->Update();
//}
//catch (itk::ExceptionObject& excep)
//{
//    std::cerr << "Exception caught !" << std::endl;
//    std::cerr << excep << std::endl;
//    std::cout << "succed " << std::endl;
//    system("pause");
//    return EXIT_FAILURE;
//}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值