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

分享

ITK-膨脹

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

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

膨脹原理

? ? ? ???圖像形態(tài)學(xué)膨脹是圖像處理中的一種基本操作,主要用于特征增強、去噪、分割和邊緣檢測等。其基本原理是通過使用一個稱為結(jié)構(gòu)元素的模板對圖像進行局部區(qū)域的最大值操作。膨脹操作通過將結(jié)構(gòu)元素在圖像上滑動,當(dāng)結(jié)構(gòu)元素與目標區(qū)域有交集時,將中心像素設(shè)置為前景,從而實現(xiàn)目標區(qū)域的擴張?。

? ? ? ?OpenCV膨脹示例參考:

? ? ? ?OpenCV-膨脹cv::dilate-CSDN博客

? ? ? ?本文介紹如何用ITK實現(xiàn)圖像形態(tài)學(xué)膨脹。

環(huán)境準備

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

功能解析

1.引入必要的頭文件:

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryDilateImageFilter.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();
// 定義結(jié)構(gòu)元素類型
typedef itk::FlatStructuringElement<2> StructuringElementType;
// 創(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("dilated_image.jpg");
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)建結(jié)構(gòu)元素,使用合適的半徑類型
StructuringElementType::RadiusType radius;
radius.Fill(1); 
// 創(chuàng)建正方形結(jié)構(gòu)元素
StructuringElementType structuringElement = StructuringElementType::Box(radius);
// 創(chuàng)建膨脹濾波器
typedef itk::BinaryDilateImageFilter<CharImageType, CharImageType, StructuringElementType> DilateFilterType;
DilateFilterType::Pointer dilateFilter = DilateFilterType::New();
dilateFilter->SetInput(thresholdFilter->GetOutput());
dilateFilter->SetKernel(structuringElement);

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

// 將膨脹圖像作為輸出圖像
writer->SetInput(dilateFilter->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 <itkBinaryDilateImageFilter.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();

    // 定義結(jié)構(gòu)元素類型
    typedef itk::FlatStructuringElement<2> StructuringElementType;

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

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

    // 保存二值化圖像
    binaryWriter->SetInput(thresholdFilter->GetOutput());

    // 創(chuàng)建結(jié)構(gòu)元素,使用合適的半徑類型
    StructuringElementType::RadiusType radius;
    radius.Fill(1); 

    // 創(chuàng)建正方形結(jié)構(gòu)元素
    StructuringElementType structuringElement = StructuringElementType::Box(radius);

    // 創(chuàng)建膨脹濾波器
    typedef itk::BinaryDilateImageFilter<CharImageType, CharImageType, StructuringElementType> DilateFilterType;
    DilateFilterType::Pointer dilateFilter = DilateFilterType::New();
    dilateFilter->SetInput(thresholdFilter->GetOutput());
    dilateFilter->SetKernel(structuringElement);

    // 將膨脹圖像作為輸出圖像
    writer->SetInput(dilateFilter->GetOutput());

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

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

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

測試效果?

?原圖:

????????二值圖及膨脹效果:

? ? ? ?注意結(jié)構(gòu)元素Fill(1),指3*3的窗口,半徑為1。

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多