Qt图像处理技术十二:QImage实现边缘检测(sobel算法)

效果图在这里插入图片描述

原理

Sobel算法是一种常用的边缘检测算法,它利用图像的灰度变化来检测图像中物体的边缘。Sobel算法主要包括以下几个步骤:

灰度化: 首先将彩色图像转换为灰度图像,因为灰度图像只包含单通道的灰度信息,有利于边缘检测处理。

计算水平和垂直方向的梯度: 对灰度图像进行水平和垂直方向的滤波操作。分别使用Sobel算子对图像进行卷积操作,Sobel算子是一个3x3的矩阵,用于对图像的每个像素进行加权求和,以便捕捉到图像中灰度变化最为明显的地方。水平方向的Sobel算子通常表示为Gx,垂直方向的Sobel算子通常表示为Gy。

合并梯度: 计算水平和垂直方向梯度的幅值,通常使用以下公式来合并水平和垂直方向的梯度:

[ G = \sqrt{G_x^2 + G_y^2} ]

其中,(G) 表示综合梯度,(G_x) 和 (G_y) 分别表示水平和垂直方向的梯度。

阈值处理: 对合并后的梯度图像进行阈值处理,通过设置合适的阈值来筛选出明显的边缘,抑制一些非边缘的干扰信息。

非极大值抑制: 进一步细化边缘位置,通过保留局部梯度最大的像素值,抑制其他非最大值的像素,以得到更细化、更准确的边缘信息。

总的来说,Sobel算法通过计算图像中每个像素点的梯度值,从而找到图像中灰度变化明显的位置,识别物体的边缘信息。这种方法在计算上比较简单,且结果比较稳定,因此被广泛应用在图像处理领域中的边缘检测任务中。

源码

// Sobel算子
int sobelOperator(const QImage &image, int x, int y)
{int gx = 0, gy = 0;// Sobel算子int sobelX[3][3] = {{-1, 0, 1},{-2, 0, 2},{-1, 0, 1}};int sobelY[3][3] = {{-1, -2, -1},{0, 0, 0},{1, 2, 1}};// 遍历Sobel算子的3x3邻域for (int i = -1; i <= 1; ++i) {for (int j = -1; j <= 1; ++j) {// 获取邻域内的像素值,超出边界的像素使用0代替int pixelX = qBound(0, x + i, image.width() - 1);int pixelY = qBound(0, y + j, image.height() - 1);QColor pixelColor(image.pixel(pixelX, pixelY));// 计算梯度值gx += sobelX[i + 1][j + 1] * pixelColor.red();gy += sobelY[i + 1][j + 1] * pixelColor.red();}}// 计算梯度的幅值int gradientMagnitude = qAbs(gx) + qAbs(gy);// 对梯度值进行归一化处理,确保在[0, 255]范围内gradientMagnitude = qBound(0, gradientMagnitude, 255);return gradientMagnitude;
}// 边缘检测函数
QImage detectEdges(const QImage &inputImage)
{QImage outputImage(inputImage.size(), inputImage.format());for (int y = 0; y < inputImage.height(); ++y) {for (int x = 0; x < inputImage.width(); ++x) {// 对每个像素应用Sobel算子int gradientMagnitude = sobelOperator(inputImage, x, y);// 将梯度值作为边缘强度,用灰度值表示outputImage.setPixelColor(x, y, QColor(gradientMagnitude, gradientMagnitude, gradientMagnitude));}}return outputImage;
}

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

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

相关文章

通过fiftyone按分类下载open-images-v7数据集,并转成yolov5可直接训练的格式

import osimport fiftyone as fo import fiftyone.zoo as foz import yamlclasses [Person, # 人 - 0Car, # 轿车 - 1Taxi, # 出租车 - 2Ambulance, # 救护车 - 3Bus, # 公共汽车 - 4Bicycle, # 自行车 - 5Motorcycle, # 摩托车 - 6Dog, # 狗 - 7Cat, # 猫 - 8M…

000002 - Hadoop环境安装

Hadoop及其大数据生态圈 1. 背景2. 实践2.1 Linux服务器准备2.2 在其中一台服务器上安装JDK2.3 在其中一台服务器上安装HADOOP2.4 本地模式运行一个hadoop案例 3. 自动化部署 1. 背景 要搭建Hadoop集群环境&#xff0c;我们需要执行如下 准备三台Linux服务器&#xff0c;服务…

Python实现日志的记录

1 日志 1、介绍 日志&#xff08;Log&#xff09;是一个记录事件或系统活动的文件或数据集&#xff0c;日志是系统管理员和开发者用于诊断问题、监视系统性能、以及追踪用户活动的关键工具。包含以下&#xff1a; 系统日志&#xff1a;记录操作系统、应用程序、硬件组件等的事…

lcd屏幕verilog显示

一,VGA原理和时序 计算机显示区的显示有许多标准,常见的有VGA、SVGA等。在这里我们用VGA接口来控制显示器,也就是视频图形阵列。作为一 种标准的显示接口得到广泛的应用。 常见的彩色显示器一般由 CRT(阴极射线管)构成,色彩是由R、G、B(红、黄、 蓝)三基色组成。显示是…

前端UI框架Element Plus 和 Ant Design Vue哪个好

Element Plus 和 Ant Design Vue 都是基于 Vue.js 的 UI 组件库&#xff0c;它们具备一系列可复用的组件和丰富的功能&#xff0c;并且是当前国内主流的两个 UI 组件库。 &#xff08;1&#xff09;Element Plus 是饿了么前端团队推出的开源项目&#xff0c;是对 Element UI 的…

completefuture造成的rpc重试事故

前言 最近经历了一个由于 completefuture 的使用&#xff0c;导致RPC重试机制触发而引起的重复写入异常的生产bug。复盘下来&#xff0c;并非是错误的使用了completefuture&#xff0c;而是一些开发时很难意识到的坑。 背景 用户反馈通过应用A使用ota批量升级设备时存在概率…

文字游侠AI:一键创作头条爆文!(附渠道和保姆级教程)

在互联网的迅猛发展中&#xff0c;自媒体已然成为一条崭新的职业路径&#xff0c;吸引着越来越多的人通过各类平台分享观点与知识&#xff0c;同时获取相应的收益。今日头条便是一个极为出色的自媒体平台&#xff0c;旗下的图文项目更是一条实现收益的有效途径。 对于众多非专业…

【SpringBoot + Vue 尚庭公寓实战】租期管理接口实现(四)

【SpringBoot Vue 尚庭公寓实战】租期管理接口实现&#xff08;四&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】租期管理接口实现&#xff08;四&#xff09;1、查询全部租期列表2、保存或更新租期信息3、根据ID删除租期 租期管理共有三个接口&#xff0c;分别是 保…

IP纯净度对跨境电商有影响吗?

当我们谈论代理IP时&#xff0c;通常会提到一个重要概念&#xff0c;那就是“IP纯净度”。 IP纯净度是指代理IP服务中所提供的IP地址的质量、干净程度和安全性&#xff0c;纯净度高的IP地址通常具备低恶意软件攻击的风险、良好的访问效果、稳定性和速度以及隐私保护等特点。在…

动态内存管理(malloc,calloc,realloc,free)+经典笔试题

动态内存管理 一. malloc 和 free1. malloc2. free 二. calloc三. realloc四.动态内存的错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动态开辟内存的一部分5.对同一块动态内存多次释放6.动态开辟内存忘记释放&…

python连接Mongodb数据库,报错:pymongo.errors.ServerSelectionTimeoutError

python连接mongdb数据库&#xff0c;本来是可以的&#xff0c;但是研发更换新的数据库后&#xff0c;一直报错&#xff1a;pymongo.errors.ServerSelectionTimeoutError&#xff0c;但是在其他人电脑上脚本执行成功。 详见报错截图&#xff1a; 在网上找了很久的解决方案&…

图标绘制软件draw.io中文安装包

Draw.io&#xff08;也称为Diagrams&#xff09;是一款功能强大的免费在线图表绘制工具。它支持绘制多种类型的图表&#xff0c;如流程图、UML图、组织结构图等&#xff0c;满足了从商务到工程设计的多领域需求。软件界面直观友好&#xff0c;操作简单&#xff0c;用户无需安装…

【网络基础1】

文章目录 学习目标一、网络基础11.网络的重要性2.osi7层模式3.协议和osi7层模型的关系4.数据的封装和解封装5.tcp的三次握手6.Ddos攻击讲解7.Tcp的四次挥手 二、网络基础21.文字编码2.IP地址的划分3.子网掩码4.同网段ip才能直接通信5.DNS解析6.DNS解析命令7.短域名为什么值钱8.…

docker命令 docker ps -l (latest)命令在 Docker 中用于列出最近一次创建的容器

文章目录 12345 1 docker ps -l 命令在 Docker 中用于列出最近一次创建的容器。具体来说&#xff1a; docker ps&#xff1a;这个命令用于列出当前正在运行的容器。-l 或 --latest&#xff1a;这个选项告诉 docker ps 命令只显示最近一次创建的容器&#xff0c;不论该容器当前…

Python代码限定抽奖次数的方法

在许多应用场景中&#xff0c;抽奖活动需要限定参与次数以确保公平性和控制成本。本文将介绍如何使用Python代码实现抽奖次数的限定。我们将讨论基本的实现方法&#xff0c;并展示一个完整的代码示例。 基本思路 限定抽奖次数的基本思路是使用一个计数器来记录每个用户已经参…

png怎么变成jpg?教你3种方法一键批量转换

png怎么变成jpg&#xff1f;PNG转JPG在图像处理中扮演着重要的角色。除了能够显著减小文件大小&#xff0c;使图像更易于分享和传输外&#xff0c;这种转换还能确保图像在各种平台和设备上都能得到良好的展示效果。无论是网站加载速度的优化&#xff0c;还是移动设备上的流畅浏…

windows 系统通过 cmd 命令终止进程

windows 系统通过 cmd 命令终止进程 1、使用 netstat 命令查看特定端口的占用情况 例如&#xff0c;要查看端口号为 8015 的情况&#xff0c;可以执行以下命令&#xff1a; netstat -ano | findstr 8105此命令会显示所有占用端口 8105 的网络连接&#xff0c;并列出 PID&…

Shopee与Lazada卖家如何运用自养号测评稳定提升销量于评价

在跨境电商行业中&#xff0c;测评对于提高产品销量是个非常优秀的辅助方式。作为东南亚电商巨头&#xff0c;Shopee和Lazada这两大主流平台上&#xff0c;卖家竞争也尤为激烈&#xff0c;卖家们不断寻求有效的方法提升自己的产品销量。为了应对这一挑战&#xff0c;测评应运而…

若依框架改造多租户模式

当前使用版本3.6.416.20.2 (Currently using 64-bit executable)https://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html 一、若依Cloud改为多租户模式 当前使用版本3.6.4&#xff0c;既然要改为多租户模式&#xff0c;多租户重点是什么&#xff0c;数据隔离&#xff0c;那么…

4、后端本地环境搭建

后端本地环境搭建 4.1 安装jdk 下载完成后双击安装的 jdk &#xff0c;点下一步&#xff0c;选择安装目录&#xff0c;一直点下一步&#xff0c;直到结束。 安装完成后同样需要配置环境变量 window s 搜索查看高级系统设置—— 高级 —— 环境变量 —— 系统变量 1、新建一…