作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處
原理
? ? ? ???itkUnaryFunctorImageFilter是 ITK(Insight Segmentation and Registration Toolkit)中的一個(gè)模板類,它并不是一個(gè)函數(shù)。這個(gè)類用于對(duì)圖像中的每個(gè)像素應(yīng)用一個(gè)一元函數(shù)(即只接受一個(gè)輸入?yún)?shù)并返回一個(gè)輸出值的函數(shù)),從而生成一個(gè)新的圖像。它在圖像的逐像素處理中非常有用,例如圖像灰度變換、閾值化、對(duì)比度調(diào)整等操作。
? ? ? ???通過(guò)遍歷輸入圖像的每個(gè)像素,將每個(gè)像素值作為輸入傳遞給用戶定義的一元函數(shù)對(duì)象(functor)。這個(gè)函數(shù)對(duì)象根據(jù)特定的算法對(duì)輸入像素值進(jìn)行處理,并返回一個(gè)新的像素值。這些新的像素值被組合成一個(gè)新的輸出圖像,輸出圖像的大小、維度和空間信息與輸入圖像相同。
? ? ? ?而圖像反轉(zhuǎn)就是將像素黑變白,白變黑,假設(shè)像素?cái)?shù)值范圍0-255,就用函數(shù)y=255-x即可實(shí)現(xiàn)反轉(zhuǎn)。
? ? ? ?本文介紹如何用itkUnaryFunctorImageFilter實(shí)現(xiàn)圖像反轉(zhuǎn)。
環(huán)境準(zhǔn)備
參見:Windows下用CMake編譯ITK及配置測(cè)試_itk配置-CSDN博客
功能解析
1.引入必要的頭文件:
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkUnaryFunctorImageFilter.h>
#include <itkPNGImageIOFactory.h>
2.定義一元模板函數(shù):
// 定義像素值反轉(zhuǎn)的函數(shù)對(duì)象
template <typename TInputPixel>
struct InvertPixelFunctor
{
using InputPixelType = TInputPixel;
using OutputPixelType = TInputPixel;
OutputPixelType operator()(const InputPixelType &input) const
{
return static_cast<OutputPixelType>(255 - input);
}
};
3.初始化:
// 定義圖像類型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注冊(cè) PNG 格式支持
itk::PNGImageIOFactory::RegisterOneFactory();
// 創(chuàng)建讀取器和寫入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
// 設(shè)置要讀取和寫入的文件
reader->SetFileName("BrainProtonDensitySlice.png");
writer->SetFileName("inverted_image.png");
4.創(chuàng)建像素值反轉(zhuǎn)濾波器:
// 創(chuàng)建像素值反轉(zhuǎn)濾波器
typedef itk::UnaryFunctorImageFilter<CharImageType, CharImageType, InvertPixelFunctor<unsigned char>> InvertFilterType;
InvertFilterType::Pointer invertFilter = InvertFilterType::New();
invertFilter->SetInput(reader->GetOutput());
5.連接過(guò)濾器輸出到寫入器并執(zhí)行寫入操作:
// 將反轉(zhuǎn)后的圖像作為輸出圖像
writer->SetInput(invertFilter->GetOutput());
// 執(zhí)行更新
try
{
writer->Update();
}
catch (itk::ExceptionObject& error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
完整代碼
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkUnaryFunctorImageFilter.h>
#include <itkPNGImageIOFactory.h>
// 定義像素值反轉(zhuǎn)的函數(shù)對(duì)象
template <typename TInputPixel>
struct InvertPixelFunctor
{
using InputPixelType = TInputPixel;
using OutputPixelType = TInputPixel;
OutputPixelType operator()(const InputPixelType &input) const
{
return static_cast<OutputPixelType>(255 - input);
}
};
int main()
{
// 定義圖像類型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注冊(cè) PNG 格式支持
itk::PNGImageIOFactory::RegisterOneFactory();
// 創(chuàng)建讀取器和寫入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
// 設(shè)置要讀取和寫入的文件
reader->SetFileName("BrainProtonDensitySlice.png");
writer->SetFileName("inverted_image.png");
// 創(chuàng)建像素值反轉(zhuǎn)濾波器
typedef itk::UnaryFunctorImageFilter<CharImageType, CharImageType, InvertPixelFunctor<unsigned char>> InvertFilterType;
InvertFilterType::Pointer invertFilter = InvertFilterType::New();
invertFilter->SetInput(reader->GetOutput());
// 將反轉(zhuǎn)后的圖像作為輸出圖像
writer->SetInput(invertFilter->GetOutput());
// 執(zhí)行更新
try
{
writer->Update();
}
catch (itk::ExceptionObject& error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
std::cout << "Image inversion completed successfully." << std::endl;
return EXIT_SUCCESS;
}
測(cè)試效果?
?原圖:
反轉(zhuǎn)效果:
? ? ? ?如果文章幫助到你了,可以點(diǎn)個(gè)贊讓我知道,我會(huì)很快樂~加油!