ITK 基础(二) — 图像分割 General Threshold

简介: 上篇文章介绍了 ITK 中的二值化分割,最终得到的是 二值图像(图像中只有两种像素值)但有时我们会遇到另外一种需求,只改变某一阈值范围的像素值,其他部分保留;这时二值化分割已经满足不了我们的基本需求了,需要寻求另外一种方法。本篇教程介绍 ITK 中的 General Threshold ,是二值化的改进版,可以只改变某一范围内的像素值,并且其它范围内像素值得到保留。

General Threshold 介绍


上篇文章介绍了 ITK 中的二值化分割,最终得到的是 二值图像(图像中只有两种像素值)

但有时我们会遇到另外一种需求,只改变某一阈值范围的像素值,其他部分保留;这时二值化分割已经满足不了我们的基本需求了,需要寻求另外一种方法。

本篇教程介绍 ITK 中的 General Threshold ,是二值化的改进版,可以只改变某一范围内的像素值,并且其它范围内像素值得到保留。


原理讲解

General Threshold 中用到了三种分割方式:

第一种,原理图如下,该方法需要设置一个低临界阈值 Lower Threshold,图像中像素值若低于这个值,其值变为 Outsidevalue,否则像素值不变;

该方法中需要设置二个参数,低像素值设定用到的是 ThresholdBelow() 函数;用户指定  Outsidevalue;

微信图片_20220520114846.jpg

第二种,方法中需要设置一个高临界阈值 Upper Threshold,图像中像素值若高于这个值,像素值将变成 Outsidevalue,否则像素值不变;

该方法中也需要设置二个参数,高阈值设定用到 ThresholdAbove() 函数,用户指定 Outsidevalue;

微信图片_20220520114848.jpg

第三种,结合了前两种,该方法需要设置两个阈值临界 Lower Threshold 和 Upper Threshold 两个值,若像素值介于两者之间则不变,否则设为 Outsidevalue;

方法中需要设置三个参数,低阈值设定用到  ThresholdBelow() 函数,高阈值设定用到 ThresholdAbove() 函数,用户指定 Outsidevalue;

微信图片_20220520114850.jpg

代码实现

General Threshold 分割方法用到主要头文件为  itk::ThresholdImageFilter ;该 Filter 中阈值的设置用到两个函数:

  • ThresholdAbove() ;
  • ThresholdBelow() ;
#include<itkThresholdImageFilter.h>
#include<itkImage.h>
#include<itkImageFileReader.h>
#include<itkImageFileWriter.h>
#include<itkPNGImageIOFactory.h>
#include<string.h>
using namespace std;
int main()
{
    itk::PNGImageIOFactory::RegisterOneFactory();
    string input_name = "D:/ceshi1/ITK/Filter/General_Seg/input.png";
    string output_name1 = "D:/ceshi1/ITK/Filter/General_Seg/output1.png";
    string output_name2 = "D:/ceshi1/ITK/Filter/General_Seg/output2.png";
    string output_name3 = "D:/ceshi1/ITK/Filter/General_Seg/output3.png";
    using PixelType = unsigned char;
    using ImageType = itk::Image<PixelType, 2>;
    using FilterType = itk::ThresholdImageFilter<ImageType>;
    using ReaderType = itk::ImageFileReader<ImageType>;
    using WriterType = itk::ImageFileWriter<ImageType>;
    ReaderType::Pointer reader = ReaderType::New();
    WriterType::Pointer writer = WriterType::New();
    FilterType::Pointer filter = FilterType::New();
    reader->SetFileName(input_name);
    writer->SetFileName(output_name1);
    writer->SetInput(filter->GetOutput());
    filter->SetInput(reader->GetOutput());
    //first Threshold method;
    filter->SetOutsideValue(0);
    filter->ThresholdBelow(170);
    try
    {
        filter->Update();
        writer->Update();
    }
    catch (exception & e)
    {
        cout << "Caught Error" << endl;
        cout << e.what() << endl;
        return EXIT_FAILURE;
    }
    filter->ThresholdAbove(190);
    writer->SetFileName(output_name2);
    try
    {
        filter->Update();
        writer->Update();
    }
    catch (exception & e)
    {
        cout << "Caught Error" << endl;
        cout << e.what() << endl;
        return EXIT_FAILURE;
    }
    //Third Threshold Seg;
    filter->ThresholdOutside(170, 190);
    writer->SetFileName(output_name3);
    try
    {
        filter->Update();
        writer->Update();
    }
    catch (exception & e)
    {
        cout << "Caught Error" << endl;
        cout << e.what() << endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

该例子中,用到的输入图像为 ITK 官网提供的大脑切片  PNG  图像,参数设定情况如下:Lower Threshold 设为170,Upper Threshold 设为190,Outsidevalue 设为 0,

最后生成的结果图如下,第 2-4 张图片分别为 第一至第三种方法生成得到的结果。

微信图片_20220520114855.jpg

相关文章
|
自然语言处理 算法 Java
C/C++ 程序员编程规范之注释
C/C++ 程序员编程规范之注释
1395 1
|
监控 网络协议 Java
Linux 网络编程从入门到进阶 学习指南
在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。
Linux 网络编程从入门到进阶 学习指南
|
10月前
|
存储 弹性计算 人工智能
阿里云云服务器2026年收费标准、实例规格测评与优惠活动参考
阿里云云服务器2026年收费标准、实例规格测评与优惠活动参考,以阿里云4核16G云服务器为例,阿里云4核16G云服务器遵循1:4的CPU与内存黄金配比,具备较强的多任务并行处理能力和内存冗余空间,核心适配中型数据库、分布式服务、电商平台、内存密集型API等中负载业务场景,是2026年中小企业核心业务部署、团队开发测试的主流配置之一。其收费标准核心受实例规格族、计费方式、地域、带宽及存储配置影响,同时针对新用户、企业用户、老用户推出差异化优惠活动,规则透明无隐性消费。以下结合官方公示信息,完整还原4核16G云服务器的实例规格、收费标准、优惠活动、选型建议及避坑要点。
1032 3
|
12月前
|
弹性计算 运维 安全
毅硕HPC | Pritunl + ECS + Frp 搭建远程办公VPN
本教程将介绍一种 “鱼与熊掌兼得” 的创新方案:核心VPN服务(Pritunl)部署在您本地的强大工作站上,通过轻量级的FRP内网穿透工具,借助阿里云ECS提供的稳定公网入口,安全地将其服务能力发布到互联网。 这样,远程员工只需连接到一个统一的云上地址,即可直接接入您办公室或实验室的本地网络,访问其中的设备,实现真正意义上的“远程局域网”体验。
1367 1
毅硕HPC | Pritunl + ECS + Frp 搭建远程办公VPN
|
8月前
|
人工智能 安全 Linux
OpenClaw龙虾AI进阶图文教程:1分钟部署(阿里云/Win11/MacOS/Linux)百炼Coding Plan配置+7款必备Skill+避坑FAQ
“好不容易部署好OpenClaw,却在1000+ Skills中挑花眼?”——这是2026年每一位“小龙虾养殖户”(OpenClaw用户昵称)的共同困扰。作为GitHub星标突破27万的开源AI智能体,OpenClaw的核心魅力在于通过Skills(技能插件)实现“能说会做”,但海量技能中混杂着大量Demo级工具、无人维护的废弃插件,甚至权限过大的安全隐患。
1050 4
|
人工智能 算法 搜索推荐
优化RAG检索:别只关注模型,关键在于这三方面!
本文从测试开发视角,解析RAG检索模块的五大优化方向:向量化模型、文本分块、检索参数、混合检索及知识库更新。通过建立自动化评测基线与回归验证体系,确保优化效果可量化、可追溯,让测试成为RAG系统迭代的关键支撑。
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
759 0
|
Linux
在线对Linux进行磁盘扩容的技术指南。
综上所述,Linux磁盘扩容的过程,重要的不仅是技术,更是对每一步骤的深刻理解和投入的爱心。只要手握正确的工具,我们不仅能满足"孩子"的成长需求,还能享受其中的乐趣和成就。
947 10
|
JSON 数据格式 C++
VS Code debug调试时无法查看变量内容【已解决】
VS Code debug调试时无法查看变量内容【已解决】
VS Code debug调试时无法查看变量内容【已解决】
|
机器学习/深度学习 人工智能 前端开发
转载:【AI系统】AI编译器前瞻
本文基于《The Deep Learning Compiler: A Comprehensive Survey》调研,对比了TVM、nGraph、TC、Glow和XLA五个热门AI编译器,介绍了它们的特点与优势。文章还探讨了AI编译器面临的挑战,如动态Shape问题、Python编译静态化、硬件性能优化等,并展望了AI编译器的未来发展方向,包括自动并行、自动微分和Kernel自动生成等技术。
转载:【AI系统】AI编译器前瞻

热门文章

最新文章