掩膜处理
- 获取目标图像尺寸
- 利用尺寸创建新图像
- 两个图像原点、间距等指标保持一致
- 对新图像赋值(保留区域赋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;
//}