ITK-二值阈值分割

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

什么是二值阈值分割?

       二值阈值分割是一种常见的图像处理技术,用于将图像的像素值分成两个类别:前景和背景。通过设定一个或多个阈值,图像中介于这些阈值之间的像素被归类为前景,其余的像素被归类为背景。这种方法简单高效,适用于许多基础的图像处理任务。

环境准备

参见:Windows下用CMake编译ITK及配置测试_itk配置-CSDN博客

功能解析

1.引入必要的头文件:

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryThresholdImageFilter.h>
#include <itkImageIOFactory.h>
#include <itkPNGImageIOFactory.h>
#include <itkJPEGImageIOFactory.h>

我们需要引入ITK库的头文件,以便使用它们提供的图像读取、写入和处理功能。

2.初始化图像类型和读写器:

typedef itk::Image<unsigned char, 2> ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;
itk::JPEGImageIOFactory::RegisterOneFactory();
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
  • ImageType 定义了图像的数据类型和维度。这里我们使用 unsigned char 类型的2D图像。
  • ReaderTypeWriterType 分别定义了图像读取器和写入器的类型。
  • itk::JPEGImageIOFactory::RegisterOneFactory() 注册了JPEG格式的IO工厂,以便ITK可以处理JPEG格式的图像文件。
  • ReaderType::Pointer reader = ReaderType::New()WriterType::Pointer writer = WriterType::New() 分别创建了图像读取器和写入器的实例。

3.设置文件名和阈值:

reader->SetFileName("test.jpg");      // 要读取的文件名
writer->SetFileName("output.jpg");    // 写入的文件名
int lowerThreshold = 100;
int upperThreshold = 200;
  • reader->SetFileName("test.jpg") 设置要读取的图像文件的名称。
  • writer->SetFileName("output.jpg") 设置要写入的图像文件的名称。
  • writer->SetInput(reader->GetOutput()) 将读取器的输出连接到写入器的输入,这样读取的图像可以直接写入到指定文件中。

4.创建和配置二值阈值分割过滤器:

typedef itk::BinaryThresholdImageFilter<ImageType, ImageType> FilterType;
FilterType::Pointer filter = FilterType::New();
filter->SetInput(reader->GetOutput());// 设置阈值
filter->SetLowerThreshold(lowerThreshold);
filter->SetUpperThreshold(upperThreshold);// 设置分割后像素值
filter->SetOutsideValue(0);
filter->SetInsideValue(255);
  • FilterType 定义了二值阈值分割过滤器的类型。
  • 设置了阈值范围和分割后的像素值。

5.连接过滤器输出到写入器并执行写入操作:

try
{writer->Update();
}
catch (itk::ExceptionObject &error)
{std::cerr << "Error: " << error << std::endl;return EXIT_FAILURE;
}
  • writer->Update() 执行写入操作,将读取的图像保存到指定的文件中。
  • 使用 try-catch 块捕获可能的异常,并在发生错误时输出错误信息。

完整代码

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryThresholdImageFilter.h>
#include <itkImageIOFactory.h>
#include <itkPNGImageIOFactory.h>
#include <itkJPEGImageIOFactory.h>int main()
{// 初始化typedef itk::Image<unsigned char, 2> ImageType;typedef itk::ImageFileReader<ImageType> ReaderType;typedef itk::ImageFileWriter<ImageType> WriterType;itk::JPEGImageIOFactory::RegisterOneFactory();ReaderType::Pointer reader = ReaderType::New();WriterType::Pointer writer = WriterType::New();// 设置reader->SetFileName("test.jpg");      //要读取的文件名writer->SetFileName("output.jpg");    //写入的文件名int lowerThreshold = 100;int upperThreshold = 200;// 创建二值阈值分割过滤器typedef itk::BinaryThresholdImageFilter<ImageType, ImageType> FilterType;FilterType::Pointer filter = FilterType::New();filter->SetInput(reader->GetOutput());// 设置阈值filter->SetLowerThreshold(lowerThreshold);filter->SetUpperThreshold(upperThreshold);// 设置分割后像素值filter->SetOutsideValue(0);filter->SetInsideValue(255);// 输出writer->SetInput(filter->GetOutput());try{writer->Update();}catch (itk::ExceptionObject &error){std::cerr << "Error: " << error << std::endl;return EXIT_FAILURE;}std::cout << "Image segmentation completed successfully." << std::endl;return EXIT_SUCCESS;
}

测试效果 

       图像中介于100-200之间的值被设置为255(前景),0-100和200-255的值被设置0(背景),实现了基本的阈值分割。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM系列】JVM调优

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

AT32F425C8T7 开发笔记

目录 0x00 AT32F425C8T7 引脚矩阵映射关系0x01 AT32_Work_Bench 图形化配置指南0x02 AT32串口打印函数0x03 AT32 串口中断函数0x04 AT32 延时函数 0x00 AT32F425C8T7 引脚矩阵映射关系 详情可见AT32手册 AT32的矩阵映射其实也就是开启端口的复用功能&#xff0c;但是它的功能…

HTML-缓动函数-贝萨尔曲线

缓动函数速查表 (easings.net)-cubic-bezier(.06,.44,.94,.7) ✿ cubic-bezier.com 展示了如何使用easeOutSine函数来实现一个元素的平滑移动动画。这个demo创建了一个按钮&#xff0c;当点击它时&#xff0c;会使页面上的一个元素向右平滑移动。 <!DOCTYPE html> <ht…

计算机组成原理——寄存器

文章目录 1. 寄存器 2. 带寄存器的加法器 3. 时钟信号与计算速度 1. 寄存器 上一篇D触发器可以在时钟上沿存储1位数据。如果想存储多个位&#xff08;bit&#xff09;的数据&#xff0c;就需要用多个D触发器并联实现&#xff0c;这种电路称之为寄存器。 寄存器是计算机中央…

深入模拟版图工程师基础学习:CMOS工艺解析

作为模拟版图工程师&#xff0c;了解CMOS&#xff08;互补金属氧化物半导体&#xff09;工艺是非常重要的&#xff0c;以下是我们需要掌握的基本内容&#xff1a; 1.基础理论&#xff1a;理解CMOS工艺的基本原理和结构&#xff0c;包括NMOS和PMOS晶体管的构造及其工作原理。&a…

适配手机《植物大战僵尸杂交版》最新整合包,附Android、iOS、Windows保姆级教程和工具合集!

最近&#xff0c;新版的《植物大战僵尸杂交版》火爆全网啊&#xff01;许多小伙伴不知道手机和电脑怎样安装设置才能畅玩《杂交版》&#xff0c;所以今天阿星特意为大家准备了一份安装工具集。 里面有安卓、iOS及电脑端的安装包&#xff0c;包含安装视频教程、修改器、防闪退、…

力扣931. 下降路径最小和

Problem: 931. 下降路径最小和 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义状态&#xff1a;我们定义dp[i][j]为从矩阵的第一行到达位置(i, j)的最小下降路径和。 2.初始化状态&#xff1a;对于矩阵的第一行&#xff0c;即i 0时&#xff0c;dp[0][j]就是矩阵的第一…

密码学:对称加密算法、非对称加密算法、哈希算法

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

重生之我要学后端0--HTTP协议和RESTful APIs

http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下&#xff1a; 客户端请求&#xff08;Request&#xf…

【期末速成】计算机操作系统 EP07 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点十八&#xff1a;管程的概念与特征 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动之中。 本文简介&#xff1a;本人是大二…

vue 组件el-tree添加结构指示线条

效果展示: 注意&#xff1a;组件中需要添加:indent"0" 进行子级缩进处理&#xff0c;否则会出现子级缩进逐级递增 :expand-on-click-node"false" 设置点击箭头图标才会展开或者收起 代码&#xff1a; <el-tree class"tree filter-tree" :da…

张高兴的 MicroPython 入门指南:(一)环境配置、Blink、部署

目录 什么是 MicroPython环境配置 硬件部分软件部分Hello World&#xff01;Blink Pico 的引脚常见电子元件 面包板跳线开关发光二极管电阻使你的 Pico 闪烁部署参考 什么是 MicroPython MicroPython 是一个基于 Python 3.4 的高效实现&#xff0c;它专为微控制器和嵌入式系统设…

Springboot ResourceLoader获取指定package目录下所有的类(get class in jar on Linux)

get class in jar on Linux Springboot ResourceLoader获取指定package目录下所有的类 PathMatchingResourcePatternResolver resolver new PathMatchingResourcePatternResolver();String pattern ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX ClassUtils.convertClas…

“吃饭大学”!中国大学食堂排行TOP10(含西电)

同学们们&#xff0c;考研择校考虑的因素除了学术&#xff0c;地理位置等方面&#xff0c;你们还会考虑哪些因素呢&#xff1f;小研作为一个吃货&#xff0c;必定会考虑的一个因素当然是大学的食堂美食啊~ 那中国超级好吃的大学食堂在哪&#xff1f;一起来看看有没有你的目标院…

软考初级网络管理员__网站单选题

1.以下关于服务器端脚本的说法中&#xff0c;正确的是()。 Script 编写 只能采用VBScript 编写 浏览器不能解释执行 由服务器发送到客户端&#xff0c;客户端负责运行 2.站点首页最常用的文件名是()。 index.html homepage.html resource.html mainfrm.html 3.在HTML…

Java 项目的构建工具 Maven

Maven 一、Maven 简介二、Maven 安装配置1、Maven 下载安装2、Maven 配置 三、IDEA 集成 Maven四、Maven 依赖管理1、依赖配置2、依赖传递3、依赖范围4、生命周期 五、Maven 高级特性1、分模块设计与开发2、Maven 继承3、Maven 版本管理4、Maven 聚合5、私服 一、Maven 简介 M…

Mac虚拟机软件有什么用?

随着苹果M系列芯片电脑的推出&#xff0c;虚拟机的使用变得越来越流行。不同于苹果以往的Intel处理器电脑&#xff0c;其M系列芯片电脑无法安装双系统。如果要使用非macOS系统&#xff0c;可以通过创建虚拟机系统的方式实现。那么&#xff0c;虚拟机软件有什么作用和用途&#…

设计模式-代理模式和装饰者模式

二者都是结构型的设计模式. 1.代理模式 1.1定义 为其他对象提供一种代理以控制对这个对象的访问. 代理从code实现方面分为静态代理和动态代理两种&#xff1b; 从适用范围来看,分为远程代理,虚拟代理,保护代理,智能引用几种. 远程代理:为某个对象在不同的内存地址空间提供…

【Python】已解决:The method is not allowed for the requested URL.

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项进阶讨论总结 已解决&#xff1a;The method is not allowed for the requested URL. 一、分析问题背景 在开发Web应用程序时&#xff0c;常常需要处理不同的HTTP请求方法&#xff…

WPF的IValueConverter用于校验和格式化TextBox的数字输入

在数据绑定&#xff08;Data Binding&#xff09;的上下文中&#xff0c;我们经常使用继承 IValueConverter 接口的类&#xff0c;用于在源值和目标值之间进行转换。该接口定义了两个方法&#xff1a;Convert 和 ConvertBack&#xff0c;这两个方法分别用于从源值到目标值的转换…