作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
腐蚀原理
图像形态学腐蚀是图像处理中的一种基本操作,主要用于图像细化、目标提取、去除小的干扰物体以及在特定场景下辅助进行更精准的图像分割。其基本原理是通过使用一个称为结构元素的模板对图像进行局部区域的最小值操作。腐蚀操作通过将结构元素在图像上滑动,当结构元素与目标区域有交集时,将中心像素设置为背景,从而实现目标区域的缩小。
OpenCV腐蚀示例参考:
OpenCV-腐蚀cv::erode-CSDN博客
本文介绍如何用ITK实现图像形态学腐蚀。
环境准备
参见: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;
// 创建读取器和写入器
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"); // 修改输出文件名,体现是腐蚀后的图像
binaryWriter->SetFileName("binary_image.jpg");
4.创建二值化滤波器:
// 创建二值化滤波器
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.创建腐蚀滤波器:
// 创建结构元素,使用合适的半径类型
StructuringElementType::RadiusType radius;
radius.Fill(1);
// 创建正方形结构元素
StructuringElementType structuringElement = StructuringElementType::Box(radius);
// 创建腐蚀滤波器
typedef itk::BinaryErodeImageFilter<CharImageType, CharImageType, StructuringElementType> ErodeFilterType; // 定义腐蚀滤波器类型
ErodeFilterType::Pointer erodeFilter = ErodeFilterType::New();
erodeFilter->SetInput(thresholdFilter->GetOutput());
erodeFilter->SetKernel(structuringElement);
6.连接过滤器输出到写入器并执行写入操作:
// 将腐蚀图像作为输出图像
writer->SetInput(erodeFilter->GetOutput());
// 执行更新
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;// 创建读取器和写入器ReaderType::Pointer reader = ReaderType::New();WriterType::Pointer writer = WriterType::New();WriterType::Pointer binaryWriter = WriterType::New(); // 用于保存二值化图像// 设置要读取和写入的文件reader->SetFileName("test.jpg");writer->SetFileName("eroded_image.jpg"); // 修改输出文件名,体现是腐蚀后的图像binaryWriter->SetFileName("binary_image.jpg");// 创建二值化滤波器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());// 创建结构元素,使用合适的半径类型StructuringElementType::RadiusType radius;radius.Fill(1);// 创建正方形结构元素StructuringElementType structuringElement = StructuringElementType::Box(radius);// 创建腐蚀滤波器typedef itk::BinaryErodeImageFilter<CharImageType, CharImageType, StructuringElementType> ErodeFilterType; // 定义腐蚀滤波器类型ErodeFilterType::Pointer erodeFilter = ErodeFilterType::New();erodeFilter->SetInput(thresholdFilter->GetOutput());erodeFilter->SetKernel(structuringElement);// 将腐蚀图像作为输出图像writer->SetInput(erodeFilter->GetOutput());// 执行更新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。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!