图像数据处理22

news2024/9/22 21:18:50

五、边缘检测

5.4 Hough变换

该技术主要用于检测图像中的基本形状,如直线、圆、椭圆等。

Hough变换的基本原理

Hough变换的基本原理是将图像空间中的直线或曲线变换到参数空间中,通过检测参数空间中的极值点(局部最大值),确定出该曲线的描述参数,从而提取影像中的规则曲线。具体来说,Hough变换利用点与线的对偶性,将原始图像空间中的曲线或直线通过其数学表达式映射到参数空间中的一个点或曲线,进而将检测问题转化为统计峰值问题。

Hough变换通过投票机制在参数空间中寻找局部最大值点,从而实现了对图像中基本图形的检测。其的优点是能够减少一定程度的噪声还有形状的不完整性造成的误差,因为它是在统计意义上寻找形状的存在。

Hough变换的步骤

①边缘检测:首先对图像进行边缘检测,提取出图像中的边缘点,这些边缘点通常是曲线或直线上的点。

②参数空间量化:将参数平面量化,然后设置二维(或三维)累计矩阵。

③投票:对每一个边缘点,在参数空间中计算所有可能经过该点的曲线(或直线)的参数值,并对相应的参数空间坐标进行投票(累加)。

④检测峰值:在参数空间中检测出投票数较大的局部最大值点,这些点对应的参数值即为图像中存在的曲线的参数。

⑤结果输出:根据检测到的参数值,在原图像中绘制出相应的曲线或直线。

直线检测的基本原理

通常情况下直线方程为y=kx+b,其中k是斜率,b是截距。但在Hough变换中,为了处理垂直于x轴的直线(斜率无穷大)的情况,常采用极坐标形式(ρ,θ)来表示直线,其中ρ表示原点到直线的距离,θ表示直线与x轴的夹角。

\rho=x\cos \Theta +y\sin \Theta

对于图像中的每一个点(x,y),可以绘制出经过该点的所有直线,这些直线在参数空间(ρ,θ)中对应一系列的点。如果多个点在图像空间中位于同一条直线上,那么它们在参数空间中对应的点将会相交于一个点,这个点即为该直线的参数(ρ,θ)。因此,通过统计参数空间中各点的交点数(即累加值),可以得到局部最大值点,从而确定图像中的直线。

圆检测的基本原理

圆检测参数空间变为三维,包括圆心坐标(x0,y0)和半径r。对于图像中的每一个点,可以绘制出经过该点的所有可能的圆,这些圆在参数空间(x0,y0,r)中对应一系列的点。如果多个点在图像空间中位于同一个圆上,那么它们在参数空间中对应的点将会相交于一个点,这个点即为该圆的参数。

圆形检测的实现

import cv2  # 导入OpenCV库,用于图像处理  
import numpy as np  # 导入NumPy库,用于处理数组和矩阵  

# 读取图片  
image = cv2.imread('img3.jpg')  # 使用cv2.imread函数读取名为'img3.jpg'的图片  

# 转换为灰度图  
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 使用cv2.cvtColor函数将图片转换为灰度图  

# 应用高斯模糊,减少图像噪声  
gray_blurred = cv2.GaussianBlur(gray, (9, 9), 2, 2)  # 使用cv2.GaussianBlur函数对灰度图应用高斯模糊  

# 使用Hough圆变换检测圆形区域  
circles = cv2.HoughCircles(gray_blurred, cv2.HOUGH_GRADIENT, dp=1, minDist=50,
                           param1=50, param2=30, minRadius=0, maxRadius=0)  # 使用cv2.HoughCircles函数检测圆形区域  

# 在原图上绘制圆形区域  
if circles is not None:  # 如果检测到了圆形区域  
    circles = np.uint16(np.around(circles))  # 对检测到的圆形区域进行四舍五入并转换为无符号16位整数  
    for i in circles[0, :]:  # 遍历所有检测到的圆形区域  
        center = (i[0], i[1])  # 获取当前圆形的圆心坐标(这里获得了圆心的信息)  
        radius = i[2]  # 获取当前圆形的半径  
        # 绘制圆心  
        cv2.circle(image, center, 1, (0, 100, 100), 3)  # 在原图上绘制圆心  
        # 绘制圆轮廓  
        cv2.circle(image, center, radius, (255, 0, 255), 3)  # 在原图上绘制圆轮廓  

# 缩小图片尺寸  
resized_image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)  # 将处理后的图片缩小一半  
resized_original = cv2.resize(cv2.imread('img3.jpg'), (0, 0), fx=0.5, fy=0.5)  # 将原始图片缩小一半  

# 显示原图和结果图  
cv2.imshow('Original Image', resized_original)  # 显示缩小后的原始图片  
cv2.imshow('Detected Circles', resized_image)  # 显示缩小后的处理图片(包含检测到的圆形)  
cv2.waitKey(0)  # 等待用户按键  
cv2.destroyAllWindows()  # 关闭所有窗口

# 使用Hough圆变换检测圆形区域  
circles = cv2.HoughCircles(gray_blurred, cv2.HOUGH_GRADIENT, dp=1, minDist=50,
                           param1=50, param2=30, minRadius=0, maxRadius=0)  # 使用cv2.HoughCircles函数检测圆形区域  

 

1.gray_blurred:这是要进行圆形检测的灰度图像,通常已经经过了模糊处理以减少噪声。

2.cv2.HOUGH_GRADIENT:这是检测圆形所使用的方法。OpenCV 提供了几种不同的圆形检测方法,HOUGH_GRADIENT 是其中一种基于梯度的方法。

3.dp:累加器分辨率与图像分辨率的反比。dp=1 时,累加器具有与输入图像相同的分辨率。dp=2 时,累加器具有输入图像一半大小的宽度和高度。

4.minDist:检测到的圆的中心之间的最小距离。如果检测到的两个圆的中心太靠近,则只返回其中一个。

5.param1:用于 Canny 边缘检测器的高阈值(低阈值是这个值的一半)。这个参数决定了边缘检测的灵敏度。

6.param2:检测阶段累加器阈值。这个阈值用于决定一个圆是否足够“圆”。它越小,检测到的圆就越多(包括不规则的圆形);它越大,检测到的圆就越少,但检测结果会更加精确。

7.minRadius:圆半径的最小大小。

8.maxRadius:圆半径的最大大小。如果设置为 0,则函数会自动选择最大半径,这取决于图像的大小和其他参数。

注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。

本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。

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

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

相关文章

自制镜像(贫穷版)

在装了docker的机子root目录操作 mkdir -p docker-images/tomcat-image/ cd docker-images/tomcat-image/ 把这两个红框的拉到docker-images/tomcat-image/ vim Dockerfile #导入基础镜像 from centos:7 #定义作者 maintainer GGBond<2958458916qq.com&…

SpringCloudGateway重写负载均衡策略

背景 gateway中多实例请求转发&#xff0c;默认采用轮训转发策略。在有些场景下&#xff0c;某些请求想固定到某一台实例上&#xff0c;这里通过重写默认负载均衡策略的方式实现。 以下代码为&#xff0c;大文件分片上传&#xff0c;多实例场景&#xff0c;根据文件md5和实例…

OpenCV c++ 实现图像马赛克效果

VS2022配置OpenCV环境 关于OpenCV在VS2022上配置的教程可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程 图像马赛克 图像马赛克&#xff08;Image Mosaic&#xff09;的原理基于将图像的特定区域替换为像素块&#xff0c;这些像素块可以是纯色或者平均色&#xff0c…

行业智能化的“火车头效应”,由星河AI金融网络启动

相信大多数人都认可&#xff0c;在行业智能化的列车中&#xff0c;金融是毋庸置疑的“火车头”。 有数据显示&#xff0c;目前AI整体渗透率只有4%&#xff0c;不同行业的AI渗透度有极大差异。其中&#xff0c;金融由于数字基础好&#xff0c;拥抱新技术的意愿强烈&#xff0c;成…

QT中通过Tcp协议的多线程的文件传输(服务器)

首先新建一个项目命名为SendClientSever 因为要进行网络通信&#xff0c;在pro文件的第一行代码中添加network 一、窗口设计 拖一个Widget里面放入label,lineEdit,pushbutton&#xff0c;名称如图修改 程序设计 子线程recvfile类 新建一个类用来执行子线程 将新建的类的头…

2-74 基于matlab的图像k-means聚类GUI

基于matlab的图像k-means聚类GUI&#xff0c;可对彩色图像进行Kmeans和meanshift进行聚类分析&#xff0c;生成最后的聚类图像以及聚类中心的迭代轨迹。程序已调通&#xff0c;可直接运行。 2-74 matlab GUI - 小红书 (xiaohongshu.com)

如何使用Python实现招聘数据的ftree算法可视化分析?大数据实战指导

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

【JavaEE】线程安全性问题,线程不安全是怎么产生的,该如何应对

产生线程不安全的原因 在Java多线程编程中&#xff0c;线程不安全通常是由于多个线程同时访问共享资源而引发的竞争条件。以下是一些导致线程不安全的常见原因&#xff1a; 共享可变状态&#xff1a;当多个线程对共享的可变数据进行读写时&#xff0c;如果没有适当的同步机制&…

目标 CDC实例数据库更改密码,预定启动报错SQL 错误代码为“-30082”。SQL 状态为:08001。

更改完CDC目标端实例密码后&#xff0c;登录MC更新存储器密码&#xff0c;存储器可正常连接&#xff0c;启动预定报错如下&#xff1a; 源 IBM Data Replication 未获授权&#xff0c;无法复制到该目标。 登录认证失败。 发生 SQL 异常。SQL 错误代码为“-30082”。SQL 状态…

区块链知识体系fisco-bcos实战

文章目录 一、区块链发展概述及类型和特征1.1 区块链的概念1.2 区块链的起源1.3 区块链的发展历程1.4 区块链的类型和特征 二、区块链的常见技术架构2.1 技术架构2.2 核心技术 三、区块链的常见应用3.1 生态环境监测3.2 医疗废弃物追踪解决3.3 区块链在电子政务领域的应用3.4 在…

前端宝典十三:node网络详解Tcp/IP/Http及网络安全防御

讨论网络相关的问题前&#xff0c;我们首先看一下从浏览器输入 URL 到显示前端页面的流程&#xff0c;首先从TCP的应用层、传输层、网络层、数据链路层开始看&#xff1a; 一、应用层、传输层、网络层、数据链路层 以下是从浏览器输入 URL 到显示前端页面的流程顺序解析&…

android 实现简易音乐播放器

音乐App 源代码 &#xff1a; 简易音乐APP源代码 1、简介 一个简易的音乐APP&#xff0c;主要练习对四大组件的应用。感兴趣的可以看看。 播放界面如下&#xff1a; 歌曲列表界面如下&#xff1a; 项目结构如下&#xff1a; 接下来将对代码做详细介绍&#xff1a; 2、Musi…

class_3:数据类型/交互模式/ input输入

获取字符串长度 #获取字符串长度 s "hello world!" print(len(s)) print(len("hello")) #根据索引取字符 print(s[0]) print(s[11]) #type a 10 b True c 1.0 d None #空值类型 print(type(a)) print(type(b)) print(type(c)) print(type(d))命令行模…

大型物流运输无人机技术详解

随着科技的不断进步和电子商务的蓬勃发展&#xff0c;大型物流运输无人机作为未来物流体系的重要组成部分&#xff0c;正逐步从概念走向实际应用。这类无人机以其超大的载重能力、高效的运输效率和广泛的覆盖范围&#xff0c;为解决远距离、大批量货物运输难题提供了创新方案。…

【Datawhale AI夏令营第五期】 CV方向 Task01学习笔记 YOLO方案baseline

【Datawhale AI夏令营第五期】 CV方向 Task01学习笔记 YOLO方案baseline 第四期给我的体验相当不错&#xff0c;于是我又冲动报名了第五期。这次比第四期的AIGC和大模型应用都要上强度。 CV这边进度拉得快&#xff0c;Task01都发布了。一看&#xff0c;好家伙&#xff0c;老朋…

微知-PCIe配置空间中哪个字段表示设备类型?有哪三种类型?哪个字段表示厂商ID

pcie配置空间早期是246字节。由头部和设备相关部分两个region组成。其中头部64B&#xff0c;设备相关192B。 其中64B是header叫做预定义头部&#xff0c;存储设备基本信息和通用控制部分&#xff0c;比如说pcie的venderid就存在byte0和byte1。这个vendor id是PCI SIG组织统一管…

【mars3d-heatLayer】热力图在相机视角缩放时按新的raduis进行渲染

地图放大 地图缩小 代码&#xff1a; import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象// 需要覆盖config.json中地图属性参数&#xff08;当前示例框架中自动处理合并&#xff09; export const mapOptions {scene: {center: { lat: 25…

cloud compare 学习利用CC代码加快插件开发与总结(三)

建议看过前面的文章后&#xff0c;再开始本文的学习 cloud compare二次插件化功能开发详细步骤&#xff08;一&#xff09;_cloudcompare插件开发-CSDN博客 cloud compare PCA插件开发详细步骤&#xff08;二&#xff09;附代码-CSDN博客 本文完成一个点云变换的插件&#x…

HighConcurrencyCommFramework c++通讯服务器框架 :TCP粘包解决

服务器设计&#xff1a;原则综述&#xff1a; 通用服务器框架&#xff1a;游戏&#xff0c;网络交易&#xff0c;通讯框架&#xff0c;聚焦在业务逻辑上&#xff1b; 收发包&#xff1a;格式问题提出&#xff1b; 例子&#xff1a;第一条命令出拳【1abc2】&#xff0c;第二条…