小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ITK-填充孔洞

 翟天保的圖書館 2024-12-13 發(fā)布于上海

作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處

填孔原理

? ? ? ?填孔首先通過對圖像的連通性進行分析來確定孔洞的位置,再對孔洞進行填充。這個操作在圖像處理中非常常見,列舉兩個應(yīng)用場景:

  1. 圖像圖像分析:在醫(yī)學(xué)影像處理中,比如肺部CT圖像,因為肺部結(jié)構(gòu)的復(fù)雜性,當(dāng)分割出肺部區(qū)域后,可能存在一些孔洞,使用填孔算法將其填充,可以讓肺部區(qū)域更加完整,有助于更準(zhǔn)確地進行后續(xù)的疾病診斷和特征分析。
  2. 目標(biāo)物體的完整性恢復(fù):在工業(yè)檢測、計算機視覺等領(lǐng)域,對于一些別檢測分割出來的目標(biāo)物體,經(jīng)常存在內(nèi)部孔洞現(xiàn)象,填充填孔可以恢復(fù)物體的完整性,從而更好地進行形狀分析、特征提取等后續(xù)操作。

? ? ? ?本文介紹如何用ITK實現(xiàn)填充孔洞。

環(huán)境準(zhǔn)備

參見:Windows下用CMake編譯ITK及配置測試_itk配置-CSDN博客

功能解析

1.引入必要的頭文件:

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryFillholeImageFilter.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();
// 創(chuàng)建讀取器和寫入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
WriterType::Pointer binaryWriter = WriterType::New(); // 用于保存二值化圖像

3.設(shè)置文件名:

// 設(shè)置要讀取和寫入的文件
reader->SetFileName("test.jpg");
writer->SetFileName("filled_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);  // 適當(dāng)設(shè)置閾值
thresholdFilter->SetUpperThreshold(255);
thresholdFilter->SetInsideValue(255);    // 前景值
thresholdFilter->SetOutsideValue(0);     // 背景值

5.創(chuàng)建填孔濾波器:

// 創(chuàng)建填充孔洞的濾波器
typedef itk::BinaryFillholeImageFilter<CharImageType> FillholeFilterType;
FillholeFilterType::Pointer fillholeFilter = FillholeFilterType::New();
fillholeFilter->SetInput(thresholdFilter->GetOutput());  // 設(shè)置輸入為二值化后的圖像

6.連接過濾器輸出到寫入器并執(zhí)行寫入操作:

// 將填充孔洞后的圖像作為輸出圖像
writer->SetInput(fillholeFilter->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 <itkBinaryFillholeImageFilter.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();

	// 創(chuàng)建讀取器和寫入器
	ReaderType::Pointer reader = ReaderType::New();
	WriterType::Pointer writer = WriterType::New();
	WriterType::Pointer binaryWriter = WriterType::New(); // 用于保存二值化圖像

	// 設(shè)置要讀取和寫入的文件
	reader->SetFileName("test.jpg");
	writer->SetFileName("filled_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)建填充孔洞的濾波器
	typedef itk::BinaryFillholeImageFilter<CharImageType> FillholeFilterType;
	FillholeFilterType::Pointer fillholeFilter = FillholeFilterType::New();
	fillholeFilter->SetInput(thresholdFilter->GetOutput());  // 設(shè)置輸入為二值化后的圖像

	// 將填充孔洞后的圖像作為輸出圖像
	writer->SetInput(fillholeFilter->GetOutput());

	// 執(zhí)行更新
	try
	{
		// 首先保存二值化圖像
		binaryWriter->Update();

		// 然后保存填充孔洞后的圖像
		writer->Update();
	}
	catch (itk::ExceptionObject& error)
	{
		std::cerr << "Error: " << error << std::endl;
		return EXIT_FAILURE;
	}

	std::cout << "Filling holes completed successfully." << std::endl;
	return EXIT_SUCCESS;
}

測試效果?

?原圖:

?二值圖及填孔效果:

? ? ? ?如果文章幫助到你了,可以點個贊讓我知道,我會很快樂~加油!

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多