首页 > 其他分享 >ITK 实例3 PNG图像进行二维非线性映射

ITK 实例3 PNG图像进行二维非线性映射

时间:2023-08-16 14:37:27浏览次数:90  
标签:滤波器 ITK 映射 10 writer 图像 sigmoidFilter PNG

 1 #include "itkImage.h"
 2 #include "itkImageFileReader.h"
 3 #include "itkImageFileWriter.h"
 4 //非线性映射滤波器头文件
 5 #include "itkSigmoidImageFilter.h"
 6  
 7 int main( int argc, char * argv[] )
 8 {
 9   /*if( argc < 7 )
10     {
11     std::cerr << "Usage: " << std::endl;
12     std::cerr << argv[0] << "  inputImageFile   outputImageFile";
13     std::cerr << " OutputMin OutputMax SigmoidAlpha SigmoidBeta" << std::endl;
14     return EXIT_FAILURE;
15     }*/
16 //然后必须定义这个滤波器的输入、输出像素和图像类型
17   typedef   unsigned char  InputPixelType;
18   typedef   unsigned char  OutputPixelType;
19  
20   typedef itk::Image< InputPixelType,  2 >   InputImageType;
21   typedef itk::Image< OutputPixelType, 2 >   OutputImageType;
22   
23   typedef itk::ImageFileReader< InputImageType  >  ReaderType;
24   typedef itk::ImageFileWriter< OutputImageType >  WriterType;
25  
26   ReaderType::Pointer reader = ReaderType::New();
27   WriterType::Pointer writer = WriterType::New();
28   //输入图像
29   reader->SetFileName( "BrainProtonDensitySlice.png" );
30   //输出图像
31   writer->SetFileName( "Sigmoid_out.png" );
32   //我们使用图像类型来实例化滤波器类型并创建滤波器对象
33   typedef itk::SigmoidImageFilter<
34                InputImageType, OutputImageType >  SigmoidFilterType;
35   SigmoidFilterType::Pointer sigmoidFilter = SigmoidFilterType::New();
36   //输出像素中的最小值和最大值分别使用 SetOutputMinimum( ) 和 SetOutputMaximum( ) 方式来定义
37   const OutputPixelType outputMinimum = atoi( "10" );
38   const OutputPixelType outputMaximum = atoi( "240" );
39  
40   sigmoidFilter->SetOutputMinimum(   outputMinimum  );
41   sigmoidFilter->SetOutputMaximum(   outputMaximum  );
42   
43   const double  alpha = atof( "10" );
44   const double  beta  = atof( "170" );
45   /*使用 SetAlpha() 和 SetBeta() 来设置系数 α 和 β 。注意 α 是和输入亮度窗口成比例的。按
46       照惯例我们可以说这个窗口是间距[-3α , 3α] 。亮度窗口的边界并不明显。如图所示, α
47       平稳地接近它的极值。当你想通过在围绕人口均值周围定义一个间距[-3σ , 3σ] 来设置一个
48       人口测量的范围时,你可以以同样的形式来进行考虑*/
49   sigmoidFilter->SetAlpha(  alpha  );
50   sigmoidFilter->SetBeta(   beta   );
51   /*可以从其他滤波器得到 SigmoidImageFilter 的输入,例如一个图像文件 reader 。输出可
52       以像一个图像文件 writer 一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可
53       以触发 Sigmoids 滤波器的运行*/
54  
55   sigmoidFilter->SetInput( reader->GetOutput() );
56   writer->SetInput( sigmoidFilter->GetOutput() );
57   writer->Update();
58   
59   return EXIT_SUCCESS;
60 }

脑部组织结构图像进行分割时可参考的参数:

白质部分:取 最小值 =10、 最大值 =240、α = 10、β = 170

脑室部分:取 最小值 =0、 最大值 =255、α = 6.67(20/3)、β = 230

灰质部分:取 最小值 =0、 最大值 =255、α = 5(15/3)、β =195

 输入图像

 白质Sigmoid输出图像     

 脑室Sigmoid输出图像

 灰质Sigmoid输出图像

  从图片中我们可以看到,白质部分的亮度扩展到它们的动态范围(【β - 3α,β+3α 】),而亮度值在 β - 3α 之下和在 β+3α 之上的值分别映射到输出值的最小值和最大值(即白质部分在在本例中像素范围为【140,200】)。这是一个 Sigmoids 用来执行平滑亮度窗口时使用的方式。
  注意: α 和 β 都是可正可负的。一个负的 α 将对图像有相反的效果。这可以在上图中左边的图像中看到。在现实中 Sigmoids 曲线是很常见的。它们表达了图对一个刺激的灵敏性。它们也是高斯积分曲线,因此自然地可以作为高斯分布信号的一个响应。

  注:非线性映射算法只能实现像素值(0-255)范围的映射。

标签:滤波器,ITK,映射,10,writer,图像,sigmoidFilter,PNG
From: https://www.cnblogs.com/ybqjymy/p/17633926.html

相关文章

  • ITK 实例4 MHA格式文件进行三维非线性映射
    1#include"itkImage.h"2#include"itkImageFileReader.h"3#include"itkImageFileWriter.h"4//非线性映射滤波器头文件5#include"itkSigmoidImageFilter.h"6//注:非线性映射算法只能实现像素值(0-255)范围的输入输出映射。7intmain(intargc,cha......
  • ITK 实例5 PNG图像进行不带滤波的二维梯度强度提取
    图像梯度的强度广泛地应用在图像分析中,主要用来帮助检测对象轮廓和分离均匀区域。itk::GradientMagnitudeImageFilter使用一个简单的有限差分方式来计算图像中每个像素位置的梯度强度。例如:在二维情况下计算等同于将图像使用模块类型,如下所示:然后计算它们的平方和并计算和的......
  • ITK 实例6 PNG图像进行带滤波的二维梯度强度提取
    微分是对一个数字数据的不规则操作。实际中可以方便地定义一个执行微分的比例。在执行这样的滤波时使用一个高斯核被认为是最便捷的选择。通过选择一个特定的高斯标准差(σ),就可以选择一个相应的比例来去除通常被认为是噪声的高频部分。itk::GradientMagnitudeRecursiveG......
  • ITK 实例7 向量图像(将一个向量存储到一个图像像素中)
    1#include"itkVector.h"//向量类的头文件2#include"itkImage.h"34intmain(int,char*[])5{6/*向量类的使用是在基于空间中代表坐标和维数的类型之上进行模板化的。在此例中,向7量的长度和图像长度相匹配,但是并不是完全相同。我们可以用一个三维的向......
  • ITK 实例6 RGB图像像素色彩成分的访问
    1#include"itkImage.h"2#include"itkImageFileReader.h"3//为了使用itk::RGBPixel类,包含头文件4#include"itkRGBPixel.h"5//在ITK中如何表示RGB图像。6intmain(int,char*argv[])7{8//RGBPixeld类的使用是基于用来代表红、绿和蓝的像素......
  • ITK 实例8 从缓冲器中输入图像数据
    1#include"itkImage.h"2#include"itkImportImageFilter.h"//包含ImportImageFilter(图像像素数据导入缓冲器)类的头文件3#include"itkImageFileWriter.h"4//这个例子阐述了如何将数据输入到itk::Image类中。这在同其他软件系统相连时更加有5//用。许多......
  • ITK 实例1 ITK环境测试
    1#include"itkImage.h"//包含图像类的头文件2#include<iostream>34intmain()5{6//创建一个三维、像素是无符号短字符数据类型的图像7typedefitk::Image<unsignedshort,3>ImageType;8//调用New()操作创建图像并将结果分配到itk::......
  • ITK 实例2 创建图像(手动创建一个itk::Image类)
    1#include"itkImage.h"//图像类的头文件23//这个例子阐述了如何人为地创建一个itk::Image类,下面是对图像类进行实例化、声明4//和创建的最简单程序代码。56intmain(int,char*[])7{8//创建一个三维、像素是无符号短字符数据类型的图像9typ......
  • 6.1 C++ STL 序列映射容器
    Map/Multimap映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap声明映射容器,则同样可以插入相同的键值。Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个Pair同时拥有实值和键......
  • 6.1 C++ STL 序列映射容器
    Map/Multimap映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap声明映射容器,则同样可以插入相同的键值。Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个Pair同时拥有实值和键......