作者:翟天保Steven
版權聲明:著作權歸作者所有,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處
腐蝕原理
? ? ? ???圖像形態(tài)學腐蝕是圖像處理中的一種基本操作,主要用于圖像細化、目標提取、去除小的干擾物體以及在特定場景下輔助進行更精準的圖像分割。其基本原理是通過使用一個稱為結構元素的模板對圖像進行局部區(qū)域的最小值操作。腐蝕操作通過將結構元素在圖像上滑動,當結構元素與目標區(qū)域有交集時,將中心像素設置為背景,從而實現(xiàn)目標區(qū)域的縮小。
? ? ? ?OpenCV腐蝕示例參考:
? ? ? ?OpenCV-腐蝕cv::erode-CSDN博客
? ? ? ?本文介紹如何用ITK實現(xiàn)圖像形態(tài)學腐蝕。
環(huán)境準備
參見:Windows下用CMake編譯ITK及配置測試_itk配置-CSDN博客
功能解析
1.引入必要的頭文件:
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryErodeImageFilter.h>
#include <itkFlatStructuringElement.h>
#include <itkJPEGImageIOFactory.h>
#include <itkBinaryThresholdImageFilter.h>
2.初始化圖像類型和讀寫器:
// 定義圖像類型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注冊JPEG格式支持
itk::JPEGImageIOFactory::RegisterOneFactory();
// 定義結構元素類型
typedef itk::FlatStructuringElement<2> StructuringElementType;
// 創(chuàng)建讀取器和寫入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
WriterType::Pointer binaryWriter = WriterType::New(); // 用于保存二值化圖像
3.設置文件名:
// 設置要讀取和寫入的文件
reader->SetFileName("test.jpg");
writer->SetFileName("eroded_image.jpg"); // 修改輸出文件名,體現(xiàn)是腐蝕后的圖像
binaryWriter->SetFileName("binary_image.jpg");
4.創(chuàng)建二值化濾波器:
// 創(chuàng)建二值化濾波器
typedef itk::BinaryThresholdImageFilter<CharImageType, CharImageType> ThresholdFilterType;
ThresholdFilterType::Pointer thresholdFilter = ThresholdFilterType::New();
thresholdFilter->SetInput(reader->GetOutput());
thresholdFilter->SetLowerThreshold(128); // 適當設置閾值
thresholdFilter->SetUpperThreshold(255);
thresholdFilter->SetInsideValue(255); // 前景值
thresholdFilter->SetOutsideValue(0); // 背景值
5.創(chuàng)建腐蝕濾波器:
// 創(chuàng)建結構元素,使用合適的半徑類型
StructuringElementType::RadiusType radius;
radius.Fill(1);
// 創(chuàng)建正方形結構元素
StructuringElementType structuringElement = StructuringElementType::Box(radius);
// 創(chuàng)建腐蝕濾波器
typedef itk::BinaryErodeImageFilter<CharImageType, CharImageType, StructuringElementType> ErodeFilterType; // 定義腐蝕濾波器類型
ErodeFilterType::Pointer erodeFilter = ErodeFilterType::New();
erodeFilter->SetInput(thresholdFilter->GetOutput());
erodeFilter->SetKernel(structuringElement);
6.連接過濾器輸出到寫入器并執(zhí)行寫入操作:
// 將腐蝕圖像作為輸出圖像
writer->SetInput(erodeFilter->GetOutput());
// 執(zhí)行更新
try
{
// 首先保存二值化圖像
binaryWriter->Update();
// 然后保存腐蝕圖像
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 <itkBinaryErodeImageFilter.h>
#include <itkFlatStructuringElement.h>
#include <itkJPEGImageIOFactory.h>
#include <itkBinaryThresholdImageFilter.h>
int main()
{
// 定義圖像類型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注冊JPEG格式支持
itk::JPEGImageIOFactory::RegisterOneFactory();
// 定義結構元素類型
typedef itk::FlatStructuringElement<2> StructuringElementType;
// 創(chuàng)建讀取器和寫入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
WriterType::Pointer binaryWriter = WriterType::New(); // 用于保存二值化圖像
// 設置要讀取和寫入的文件
reader->SetFileName("test.jpg");
writer->SetFileName("eroded_image.jpg"); // 修改輸出文件名,體現(xiàn)是腐蝕后的圖像
binaryWriter->SetFileName("binary_image.jpg");
// 創(chuàng)建二值化濾波器
typedef itk::BinaryThresholdImageFilter<CharImageType, CharImageType> ThresholdFilterType;
ThresholdFilterType::Pointer thresholdFilter = ThresholdFilterType::New();
thresholdFilter->SetInput(reader->GetOutput());
thresholdFilter->SetLowerThreshold(128);
thresholdFilter->SetUpperThreshold(255);
thresholdFilter->SetInsideValue(255);
thresholdFilter->SetOutsideValue(0);
// 保存二值化圖像
binaryWriter->SetInput(thresholdFilter->GetOutput());
// 創(chuàng)建結構元素,使用合適的半徑類型
StructuringElementType::RadiusType radius;
radius.Fill(1);
// 創(chuàng)建正方形結構元素
StructuringElementType structuringElement = StructuringElementType::Box(radius);
// 創(chuàng)建腐蝕濾波器
typedef itk::BinaryErodeImageFilter<CharImageType, CharImageType, StructuringElementType> ErodeFilterType; // 定義腐蝕濾波器類型
ErodeFilterType::Pointer erodeFilter = ErodeFilterType::New();
erodeFilter->SetInput(thresholdFilter->GetOutput());
erodeFilter->SetKernel(structuringElement);
// 將腐蝕圖像作為輸出圖像
writer->SetInput(erodeFilter->GetOutput());
// 執(zhí)行更新
try
{
// 首先保存二值化圖像
binaryWriter->Update();
// 然后保存腐蝕圖像
writer->Update();
}
catch (itk::ExceptionObject& error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
std::cout << "Erosion completed successfully." << std::endl;
return EXIT_SUCCESS;
}
測試效果?
?原圖:
?二值圖及腐蝕效果:
? ? ? ?注意結構元素Fill(1),指3*3的窗口,半徑為1。
? ? ? ?如果文章幫助到你了,可以點個贊讓我知道,我會很快樂~加油!