1. 前言
比如原来是 − 1023 − 2034 -1023-2034 −1023−2034,现在需要调整到 0 − 255 0-255 0−255
2. 代码
2.1 definition.h
#pragma once
#include<string>
#include<itkImage.h>
constexpr unsigned int Dimension = 3;
using PixelType = double;
using ImageType = itk::Image<PixelType, Dimension>;
using ImageStyle = ImageType::Pointer;
2.2 RescaleIntensity.h
#pragma once
#include"definition.h"
class RescalIntensity
{
public:
/// <summary>
/// 读取nii图像
/// </summary>
/// <param name="file_path">文件路径</param>
/// <param name="out_image">读到的图像</param>
void read_nii(
const std::string& file_path,
ImageStyle& out_image);
/// <summary>
/// 写入nii文件
/// </summary>
/// <param name="input_image">输入图像</param>
/// <param name="save_path">保存路径</param>
void write_nii(
const ImageStyle& input_image,
const std::string& save_path);
/// <summary>
/// 重置像素值尺度
/// </summary>
/// <param name="input_image">输入(输出)图像</param>
void resale_intensity(ImageStyle& input_image);
};
2.3 RescaleIntensity.cpp
#include "RescalIntensity.h"
#include<itkImageFileReader.h>
#include<itkNiftiImageIO.h>
#include<itkRescaleIntensityImageFilter.h>
#include<itkImageFileWriter.h>
void RescalIntensity::read_nii(
const std::string& file_path,
ImageStyle& out_image)
{
using ReaderType = itk::ImageFileReader<ImageType>;
auto reader = ReaderType::New();
using ImageIOType = itk::NiftiImageIO;
auto niiIO = ImageIOType::New();
reader->SetImageIO(niiIO);
reader->SetFileName(file_path);
try {
reader->Update();
}
catch (const itk::ExceptionObject& e) {
std::cout << "error in reading nii" << std::endl;
std::cout << e.what() << std::endl;
}
out_image = reader->GetOutput();
}
void RescalIntensity::write_nii(
const ImageStyle& input_image,
const std::string& save_path)
{
using WriterType = itk::ImageFileWriter<ImageType>;
auto writer = WriterType::New();
using ImageIOType = itk::NiftiImageIO;
auto niiIO = ImageIOType::New();
writer->SetImageIO(niiIO);
writer->SetInput(input_image);
writer->SetFileName(save_path);
try {
writer->Update();
}
catch (const itk::ExceptionObject& e) {
std::cout << "error in writing nii" << std::endl;
std::cout << e.what() << std::endl;
}
}
void RescalIntensity::resale_intensity(
ImageStyle& input_image)
{
using FilterType = itk::RescaleIntensityImageFilter<ImageType, ImageType>;
auto filter = FilterType::New();
filter->SetInput(input_image);
filter->SetOutputMinimum(0);
filter->SetOutputMaximum(255);
try {
filter->Update();
}
catch (const itk::ExceptionObject& e) {
std::cout << "error in rescaling" << std::endl;
std::cout << e.what() << std::endl;
}
input_image = filter->GetOutput();
}
2.4 main.cpp
#include<iostream>
#include"RescalIntensity.h"
int main()
{
using std::cout;
using std::endl;
RescalIntensity rescale_obj;
ImageStyle input_image;
rescale_obj.read_nii(
"D:/test/05150_2/05150_2.nii.gz",
input_image);
rescale_obj.resale_intensity(input_image);
rescale_obj.write_nii(input_image, "res.nii.gz");
return 0;
}