基于梯度统计学的渐变型亮缝识别算法

news2025/6/14 15:29:27

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

一、场景痛点

       在图像处理相关的实际工程中,会出现各式各样的现实复杂问题,有的是因为机械设计导致,有的是因为硬件引起(相机、探测器、传感器等),有的是外部环境引起。这些问题跟我们的图像处理工作带来了困难和挑战。

       本文提出的场景是在捕捉图像过程中,图像中出现了某种不在预期的亮缝信息,我们要做的就是对其进行补偿修正,而修正的前提是识别,本文重点关注如何识别亮缝的感兴趣区域ROI。该场景的痛点就在于亮缝信息是覆盖在原数据之上的,而原数据本身的信息复杂度是不固定的,可能会出现各种各样的实体轮廓,因此在设计算法的时候,要尽可能地考虑周全,使得算法具备一定适用性、鲁棒性。

       针对此场景,本文提出了一种基于梯度统计学的渐变型亮缝识别算法,接下来将简单介绍下算法原理和流程,并展示相关的效果图。

二、算法原理和流程

       亮缝信息往往有不同特征,有的是突变型,这种也是比较好提取的,有的是渐变型,即逐渐变亮再变暗的,本文关注的也是此类亮缝。

2.1 梯度计算

       待识别图像如下所示,不难发现图像出现了一层明显的亮缝,对于渐变型亮缝,我们第一时间想到的自然是导数,即数据的变化值,而导数给予方向性后也就是我们常说的梯度。

       对其XY方向分别进行导数计算,如下图所示。

       进而得到了梯度信息,我所测试的数据是沿X轴移动的亮缝,因此只考虑X方向即可。

2.2 统计提取

       观察梯度信息,可以发现亮缝在其移动方向上呈现特征是先上升再平稳后下降的过程,那我们识别亮缝问题就转为了识别一个上升区和一个下降区的组合。对梯度图像中亮缝形体方向即Y方向进行梯度统计。

      若梯度值大于0则归为上升,若梯度值小于等于0则归为下降;建立一个上升掩膜和一个下降掩膜;对每一个x而言,遍历y,用上升计数值posCount和下降计数值negCount分别累计梯度的升降数量;若累计上升数超过统计阈值,则在上升掩膜中,将该x对应的所有y值设为255;若累计下降数超过统计阈值,则在下降掩膜中,将该x对应的所有y值设为255。

      统计后的掩膜图如下所示,先上升掩膜,后下降掩膜:

       如上所示,一个上升区和一个下降区就构成了亮缝,接下来要进行进一步的处理。

2.3 图像处理

       虽然上面的图看起来比较理想,但前文也说过,若亮缝所处图像的基底图像信息复杂度偏高,此时的掩膜信息中就会出现如下几种异常情况。

  1. 掩膜中出现某个很窄的区。这不是亮缝的一部分,而是原图像基底的某种特征与上述识别原理在一定程度上重合引起的。
  2. 掩膜中上升区或下降区并非是完整的,中间可能存在很窄的一列空洞。这是因为亮缝叠加了某些信息后,其梯度变化收到了一定程度的干扰,呈非连续态。
  3. 只识别到亮缝的上升区或下降区,或者都没识别到。亮缝叠加了某些信息后,其特征不再是渐变特征,而是变成了不规则态。

       针对上述三种常见情况,第三种因为亮缝本身的特征偏离了算法识别的核心原理,因此无法成功识别。而第一种情况,可通过开运算先腐蚀后膨胀的方式处理掉,第二种情况,可通过闭运算先膨胀后腐蚀的方式处理掉。

2.4 亮缝识别

       经过图像处理后的上升掩膜和下降掩膜,分别提取其连通域轮廓信息,计算中心点;基于欧氏距离,计算上升掩膜中各个区和下降掩膜中各个区的中心点距离,取最短距离且符合先上升后下降特征的一对组合,作为目标亮缝的上升区和下降区;两区进行连接,即可得到亮缝的ROI。

2.5 算法流程图

       综上,该算法的流程图可简化为:

三、代码分享

main.cpp

#include "globalfunc.h"

int main()
{
	// 文件夹目录
	string folder = "data/";
	// 文件路径
	string path;
	path = folder + "1.his";
	// 读取源数据
	cv::Mat src = GlobalFunc::readHisPicture(path);
	// 基于梯度统计学的渐变型亮缝识别算法(单缝)
	cv::Mat look;
	cv::Rect roi;
	bool findFlag = GlobalFunc::identifyBrightSeamBasedOnGradientStatistics(src, look, roi);
	// 显示
	imshow("Ori", src);
	imshow("Result", look);
	cv::waitKey(0);
	return 0;
}

       本文仅用于本人复盘技术思路,C++完整代码不进行分享,有想要技术交流的同学可以私聊我,大家共同进步。

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

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

相关文章

图|dfs bfs|最小生成树|最短路|一篇搞定图的所有知识点

文章目录 图前言项目代码仓库图的基本概念图的表示方法邻接矩阵邻接表图的一些相关概念 图的遍历bfsdfs如果给的图不是连通图? 最小生成树Kruskal算法Prim算法 最短路径单源最短路径--Dijkstra算法单源最短路径--Bellman-Ford算法多源最短路径--Floyd-Warshall算法 …

Swift 入门学习:集合(Collection)类型趣谈-下

概览 集合的概念在任何编程语言中都占有重要的位置,正所谓:“古来聚散地,宿昔长荆棘;游人聚散中,一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理,怎能不让…

Elasticsearch从入门到精通-03基本语法学习

Elasticsearch从入门到精通-03基本语法学习 👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES基本语法,主要包括索引管理、文档管理、映射管理等内容 1.1 了解Restful ES对数据进行增、删、改、查是以…

《Effective Modern C++》- 极精简版 15-21条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective Modern C》- 极精简版 5-14条。本文列出《Effective Modern C》的15-21条的个人理解的极精简版本。 Item15、尽量使用constexpr constexpr形容对象 constexpr对象都是const,但是const对象不一定是conste…

解读BOT攻击,探索灵活高效的防护之道

回顾早期的互联网应用,由于业务流量比较小,往往单台服务器就能满足负载需求。随着互联网的流量越来越大,单服务器已经不能满足业务需求,无论它优化得再好,都较难承受大量的访问压力。支持负载均衡的技术很多&#xff0…

8. 超级终端和 Minicom

超级终端和 Minicom 在对目标板进行查看、操作或目标板和上位机进行文件传输与通信时,需要安装终端软件。通过终端软件来对目标板进行配置,或者执行目标板上的程序与主机进行通信。 下面介绍 3种终端软件,具体开发时,你仅需任意使…

大语言模型的“大”体现在哪里

大语言模型中的"大"通常体现在以下几个方面,参数数量,训练数据和计算资源: 参数数量: 大语言模型的一个显著特征是其庞大的参数数量。参数的数量决定了模型的复杂度和表示能力。更多的参数通常意味着模型可以捕捉更复…

DiffuRec扩散推荐模型笔记

1 Title DiffuRec: A Diffusion Model for Sequential Recommendation(ZIHAO LI、CHENLIANG L、AIXIN SUN)【2023 ACM Transactions on Information Systems】 2 Conclusion This paper is the first attempt to apply the diffusion model to SR, and…

ESP8266程序烧录方法(以ESPFlashDownloadTool为例)

0 工具准备 ESP8266必须包含的目标bin ESPFlashDownloadTool_v3.6.3.exe NodeMCU(ESP8266) sscom5 1 ESP8266程序烧录方法(以ESPFlashDownloadTool为例) 1.1 生成ESP8266所需的bin文件 可以参考前面所写的《安信可IDE&#xff0…

算法学习05:离散化、区间合并

算法学习05:离散化、区间合并 文章目录 算法学习05:离散化、区间合并前言需要记忆的模版:一、离散化1.例题:离散化 区间和:拓展: 二、区间合并(贪心)1.例题: 总结 前言 需要记忆的模…

【Linux】cpp-httplib库

目录 升级gcc版本 下载cpp-httplib的zip安装包,上传到服务器 ​编辑 简单使用 首先打开gittee,搜索cpp-httplib,选择其中一个即可 也可以点下方链接 cpp-httplib库:cpp-httplib: cpp-httplib (gitee.com) 注意:cpp-httplib在使用的时候需…

300分钟吃透分布式缓存-24讲:Redis崩溃后,如何进行数据恢复的?

Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF,以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在需要进行 RDB 持久化时,Redis 会将内存中的所有数据以二进制的格式落地,每…

VBA更新xlOLELinks链接的值

xlOLELinks是在Excel文档中插入对象的链接,该链接能够显示被插入文档的数据,通常情况下链接的数值会自动更新,但有时更新也会不及时或失效,这时就需要手动更新,如下图: 以插入Word文档为例,使用…

力扣刷题Days14第二题--80删除数组中重复元素||(js)

目录 1,题目-中等 2,代码 双指针 3,学习与总结 思路学习与整理 1,题目-中等 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组…

这是谁的女儿?其母亲早已红过头了,现在小小年纪的她也爆红网络,没想到吧?

这是谁的女儿?其母亲早已红过头了,现在小小年纪的她也爆红网络,没想到吧? 原来,作母亲的她在红极一时后似乎沉寂了下来,没想到她11岁的女儿近年来也在社交媒体上走红,她为何也成了小网红呢&…

Python实现滚动加权最小二乘法回归模型(RollingWLS算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 滚动加权最小二乘法回归模型(Rolling Weighted Least Squares, RollingWLS)是一…

vscode 格式化prettier失败出现一大堆错误

如题,使用vscode开发项目时候,会自动进行格式化【安装prettier插件】 但是有时候会出现格式化失败的情况,如果插件安装正确,则可能是代码出现了格式问题。

mysql-视图,创建表,存储过程,循环,判断实操命令

数据库操作命令在IDEA工具database的console命令 数据库表结构与视图 事务隔离级别RR(REPEATABLE-READ)解决不可重复读演示 mysql-RR隔离级别 -- 查询隔离级别 select transaction_isolation;-- 设置隔离级别 set session transaction isolation level …

常见BUG如何在测试过程中分析定位

前言 在测试的日常工作中,相信经常有测试的小伙伴遇到类似的情况:在项目上线时,只要出现问题(bug),就很容易成为“背锅侠”。 软件测试人员在工作中是无法避免的要和开发人员和产品经理打交道的&#xff…

鸿蒙原生应用元服务开发-WebGL网页图形库开发概述

WebGL的全称为Web Graphic Library(网页图形库),主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES,可以在HTML5的canvas元素对象中使用,无需使用插件,支持跨平台。WebGL程序是由JavaScr…