ITK-腐蚀

作者:翟天保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。

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

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

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

相关文章

MySQL多表查询时有哪些连接方式?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL多表查询时有哪些连接方式?】面试题。希望对大家有帮助&#xff1b; MySQL多表查询时有哪些连接方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中进行多表查询时&#xff0c;常见的连接方式有以下…

Ollama管理本地开源大模型,用Open WebUI访问Ollama接口

现在开源大模型一个接一个的,而且各个都说自己的性能非常厉害,但是对于我们这些使用者,用起来就比较尴尬了。因为一个模型一个调用的方式,先得下载模型,下完模型,写加载代码,麻烦得很。 对于程序的规范来说,只要东西一多,我们就需要一个集中管理的平台,如管理python…

Docker 安装 sentinel

Docker 安装系列 1、拉取 [rootTseng ~]# docker pull bladex/sentinel-dashboard Using default tag: latest latest: Pulling from bladex/sentinel-dashboard 4abcf2066143: Pull complete 1ec1e81da383: Pull complete 56bccb36a894: Pull complete 7cc80011dc6f: Pull…

Python实现中国象棋

探索中国象棋 Python 代码实现&#xff1a;从规则逻辑到游戏呈现 中国象棋&#xff0c;这款源远流长的棋类游戏&#xff0c;承载着深厚的文化底蕴与策略智慧。如今&#xff0c;借助 Python 与 Pygame 库&#xff0c;我们能够在数字世界中复刻其魅力&#xff0c;深入探究代码背后…

Spring--07-01---@Transactional注解失效的8大场景

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Transactiona1.默认回滚&#xff1a;RuntimeException 1.Transactional注解失效的8大场景1.数据库引擎是否支持事务3.方法不是public的4.自身调用5.数据源没有配置事…

SMMU软件指南SMMU编程之寄存器

安全之安全(security)博客目录导读 本博客介绍了SMMUv3的编程接口&#xff1a; • SMMU寄存器 • 流表&#xff08;Stream table&#xff09; • CD&#xff08;Context Descriptor&#xff09; • 事件队列&#xff08;Event queue&#xff09; • 命令队列&#xff08;…

负载均衡oj项目:介绍

目录 项目介绍 项目演示 项目介绍 负载均衡oj是一个基于bs模式的项目。 用户使用浏览器向oj模块提交代码&#xff0c;oj模块会在所有在线的后端主机中选择一个负载情况最低的主机&#xff0c;将用户的代码提交给该主机&#xff0c;该主机进行编译运行&#xff0c;将结果返回…

python 基于 docx 文件模板生成 docx 或 PDF 文件

需求背景 提供一个Word文档模板&#xff0c;使用python程序替换里边的占位符&#xff0c;替换内容包括文本和图片&#xff0c;然后输出docx或者PDF文件。 功能演示 输入示例 输出示例 实现程序 import os import shutil import subprocess import timefrom docx import Doc…

使用 Ansys Fluent 对气体泄漏检测进行建模

了解使用 Ansys Fluent 仿真气体泄漏和确保安全的前沿技术。 挑战 气体泄漏对人类安全和环境构成重大风险。及早检测气体泄漏可以防止潜在的灾难&#xff0c;包括爆炸、火灾和有毒物质暴露。有效的气体泄漏检测系统对于石油和天然气、化学加工和住宅基础设施等行业至关重要。…

Mac软件推荐

Mac软件推荐 截图SnipasteXnipBob 快捷启动Raycast 系统检测Stats 解压缩The UnarchiverKeka&#xff08;付费&#xff09; 视频播放IINA 视频下载Downie&#xff08;付费&#xff09; 屏幕刘海TopNotchMediaMate&#xff08;付费&#xff09;NotchDrop&#xff08;付费&#x…

在 Kibana 中为 Vega Sankey 可视化添加过滤功能

作者&#xff1a;来自 Elastic Tim Bosman 及 Miloš Mandić 有兴趣在 Kibana 中为 Vega 可视化添加交互式过滤器吗&#xff1f;了解如何利用 “kibanaAddFilter” 函数轻松创建动态且响应迅速的 Sankey 可视化。 在这篇博客中&#xff0c;我们将了解如何启用 Vega Sankey 可视…

阿里云数据库MongoDB版助力极致游戏高效开发

客户简介 成立于2010年的厦门极致互动网络技术股份有限公司&#xff08;以下简称“公司”或“极致游戏”&#xff09;&#xff0c;是一家集网络游戏产品研发与运营为一体的重点软件企业&#xff0c;公司专注于面向全球用户的网络游戏研发与运营。在整个产业链中&#xff0c;公…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天&#xff0c;企业迎来了前所未有的发展机遇&#xff0c;规模迅速扩张&#xff0c;市场版图不断延伸。然而&#xff0c;伴随着这种快速的发展&#xff0c;一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…

MongoDB存储照片和文件存储照片的区别在那里?

一、维度对比 比较维度MongoDB存储照片文件系统存储照片数据模型使用文档存储数据&#xff0c;可以存储不同结构的照片。以文件的形式存储照片&#xff0c;每个文件独立存在。性能高效的数据检索&#xff0c;适用于大规模应用程序中的高效检索和访问。但在处理大量高分辨率图片…

爬虫基础知识点

最近看了看爬虫相关知识点&#xff0c;做了记录&#xff0c;具体代码放到了仓库&#xff0c;本文仅学习使用&#xff0c;如有违规请联系博主删除。 这个流程图是我使用在线AI工具infography生成的&#xff0c;这个网站可以根据url或者文本等数据自动生成流程图&#xff0c;挺…

PCL点云库入门——PCL库可视化之CloudViewer类简单点云信息显示

1、前言 可视化&#xff08;visualization&#xff09;涉及运用计算机图形学和图像处理技术&#xff0c;将数据转换成图像并在屏幕上展示&#xff0c;同时支持交互式处理。在PCL库中&#xff0c;一系列强大的可视化工具可供使用&#xff0c;其中较为流行的包括CloudViewer和PCL…

GUNS搭建

一、准备工作 源码下载&#xff1a; 链接: https://pan.baidu.com/s/1bJZzAzGJRt-NxtIQ82KlBw 提取码: criq 官方文档 二、导入代码 1、导入后端IDE 导入完成需要&#xff0c;需要修改yml文件中的数据库配置&#xff0c;改成自己的。 2、导入前端IDE 我是用npm安装的yarn npm…

Keil5添加stc的库到keil5中

1打开STC-ISP软件 在上图中找到keil仿真设置 再点击 点击之后会弹出选择文件 必须找到c51选中确定即可 之后在keil5中可以看到创建项目选择芯片是可以看到图中的选项

Vue基础记录

Vue 整体要学的 vue基础 vue-cli vue-router vuex element-ui vue3 简介 特点: 组件化声明式编码使用虚拟dom 优秀Diff算法 在生成真实dom的时候,会先有一部虚拟dom,且新的虚拟dom会和旧的虚拟dom进行diff算法比较 如果有些dom没改,那么就可以不用再重新渲染了,提高性能 …

【和春笋一起学C++】for语句和递增操作符

目录 1. for语句简介 2. for语句实例 3. 顺序点和副作用 4. 递增递减操作符应用于指针 1. for语句简介 for语句包含控制体和循环体&#xff0c;循环体跟在控制体的后面。 如下所示&#xff0c;控制体为for括号中的几个表达式&#xff0c;循环体为花括号中的几条语句。 fo…