opencv—常用函数学习_“干货“_9

目录

二五、霍夫变换

检测图像中的直线 (HoughLines)

检测图像中的直线段 (HoughLinesP)

检测图像中的圆 (HoughCircles)

解释

二六、傅里叶变化

获取最优的DFT大小 (getOptimalDFTSize)

执行离散傅里叶变换 (dft) 和 逆变换 (idft)

解释

实际应用

图像滤波示例

http://t.csdnimg.cn/i8pqt —— opencv—常用函数学习_“干货“_总(VIP)

散的正在一部分一部分发,不需要VIP。

资料整理不易,有用话给个赞和收藏吧。


二五、霍夫变换

        在OpenCV中,霍夫变换是一种常用的图像处理技术,用于检测图像中的几何形状,如直线和圆。OpenCV提供了三个主要的霍夫变换函数:HoughLinesHoughLinesPHoughCircles。下面介绍这些函数及其使用示例。

霍夫变换函数
HoughLinesHoughLinesPHoughCircles
检测图像中的直线检测图像中的直线段检测图像中的圆

检测图像中的直线 (HoughLines)
import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Canny边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)# 使用HoughLines检测直线
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)# 绘制检测到的直线
if lines is not None:for rho, theta in lines[:, 0]:a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imshow('Hough Lines', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
检测图像中的直线段 (HoughLinesP)
# 使用HoughLinesP检测直线段
lines_p = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=100, maxLineGap=10)# 绘制检测到的直线段
if lines_p is not None:for x1, y1, x2, y2 in lines_p[:, 0]:cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.imshow('Hough Lines P', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
检测图像中的圆 (HoughCircles)
# 使用HoughCircles检测圆
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=50, param2=30, minRadius=0, maxRadius=0)# 绘制检测到的圆
if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:# 绘制圆的外圆cv2.circle(image, (i[0], i[1]), i[2], (255, 0, 0), 2)# 绘制圆心cv2.circle(image, (i[0], i[1]), 2, (0, 255, 0), 3)cv2.imshow('Hough Circles', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

解释

  • HoughLines函数:用于检测图像中的直线。该函数的参数如下:

    • image:输入图像(边缘检测后的二值图像)。
    • rho:距离分辨率(像素)。
    • theta:角度分辨率(弧度)。
    • threshold:累加平面的阈值,只有高于该阈值的直线才会被检测出来。
  • HoughLinesP函数:用于检测图像中的直线段。该函数的参数如下:

    • minLineLength:最小直线长度,短于此长度的直线段会被忽略。
    • maxLineGap:允许的最大间隔,一条直线上的点间隔不超过此值时,会被看作一条直线。
  • HoughCircles函数:用于检测图像中的圆。该函数的参数如下:

    • dp:累加器分辨率与图像分辨率的反比。
    • minDist:检测到的圆心之间的最小距离。
    • param1:传递给Canny边缘检测算子的高阈值。
    • param2:圆心检测的累加器阈值。

        通过这些示例,可以看到如何使用OpenCV中的霍夫变换函数来检测图像中的几何形状。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像检测任务。

二六、傅里叶变化

        在OpenCV中,傅里叶变换是一种重要的图像处理技术,用于频域分析。OpenCV提供了几个主要的傅里叶变换相关函数:getOptimalDFTSizedftidft。下面介绍这些函数及其使用示例。

傅里叶变换函数
getOptimalDFTSizedftidft
获取最优的DFT(离散傅里叶变换)大小执行离散傅里叶变换执行离散傅里叶逆变换

获取最优的DFT大小 (getOptimalDFTSize)
import cv2
import numpy as np# 获取最优的DFT大小
rows, cols = 480, 640  # 假设图像大小
optimal_rows = cv2.getOptimalDFTSize(rows)
optimal_cols = cv2.getOptimalDFTSize(cols)print(f"Original size: ({rows}, {cols})")
print(f"Optimal DFT size: ({optimal_rows}, {optimal_cols})")
执行离散傅里叶变换 (dft) 和 逆变换 (idft)
# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)
rows, cols = image.shape# 获取最优的DFT大小
optimal_rows = cv2.getOptimalDFTSize(rows)
optimal_cols = cv2.getOptimalDFTSize(cols)# 扩展图像到最佳大小
padded_image = cv2.copyMakeBorder(image, 0, optimal_rows - rows, 0, optimal_cols - cols, cv2.BORDER_CONSTANT, value=0)# 执行DFT
dft_image = cv2.dft(np.float32(padded_image), flags=cv2.DFT_COMPLEX_OUTPUT)# 移动频谱
dft_shift = np.fft.fftshift(dft_image)# 计算幅度谱
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))# 显示幅度谱
cv2.imshow('Magnitude Spectrum', magnitude_spectrum)
cv2.waitKey(0)
cv2.destroyAllWindows()# 执行逆DFT
idft_shift = np.fft.ifftshift(dft_shift)
idft_image = cv2.idft(idft_shift)
idft_image = cv2.magnitude(idft_image[:, :, 0], idft_image[:, :, 1])# 显示逆变换后的图像
cv2.imshow('Inverse DFT Image', idft_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

解释

  • getOptimalDFTSize函数:返回一个最优大小,适合进行快速傅里叶变换(FFT),提高计算效率。图像的行和列会被扩展到这些最优大小。
  • dft函数:对输入图像进行离散傅里叶变换,返回频域表示。参数flags=cv2.DFT_COMPLEX_OUTPUT指示输出为复数形式。
  • idft函数:对频域表示进行逆变换,返回时域图像。

实际应用

        傅里叶变换在图像处理中有广泛的应用,包括图像滤波、压缩和特征提取等。

图像滤波示例

        在频域中,可以通过对频谱进行处理来实现图像滤波,例如高通滤波和低通滤波。

# 创建低通滤波器
crow, ccol = optimal_rows // 2 , optimal_cols // 2
mask = np.zeros((optimal_rows, optimal_cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1# 应用低通滤波器
fshift = dft_shift * mask# 计算滤波后的幅度谱
fshift_magnitude_spectrum = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))# 显示滤波后的幅度谱
cv2.imshow('Filtered Magnitude Spectrum', fshift_magnitude_spectrum)
cv2.waitKey(0)
cv2.destroyAllWindows()# 执行逆DFT
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])# 显示滤波后的图像
cv2.imshow('Filtered Image', img_back)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

        通过这些示例,可以看到如何使用OpenCV中的傅里叶变换函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理任务。

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

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

相关文章

Qt6 OpenCV4视频监控系统项目源码解析——附源码及编译运行步骤

很多刚毕业,或者想着转行到C Qt方向的小伙伴,平时可能拿不出比较像样的项目。这里你可要好好收藏啦。自己拿回去好好改改,就可以成为自己的项目经历了。祝各位找工作顺利呀。 好了。废话不多说。 这个项目架构采用的是MVC架构,结…

比较RMI、HTTP+JSON/XML、gRPC

RMI(Remote Method Invocation,远程方法调用)、HTTPJSON/XML、gRPC是三种不同的技术或协议,它们各自在远程通信、数据传输和服务交互方面有不同的特点和应用场景。以下是对这三种技术的详细比较: 1. RMI(R…

Porfinet从转DeviceNet从总线协议转换网关

产品功能 1. 远创智控YC-DNT-PN型是Porfinet从转Devicenet从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Devicenet网络中,‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口,‌分别用于连接Po…

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现:实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…

【verilog语法】$clog2(IEEE Std 1364-2005)

一、前言 在进行Verilog设计时,有时需要根据内存大小来计算地址的位宽,或者根据变量的值来确定变量的位宽,这时可以自己编写相关的可综合函数,或者verilog-2005起开始支持的$clog2系统函数。 二、自己编写的function function i…

代码规范性

代码规范性 命名规范代码格式注释代码结构异常处理代码复用代码审查空格的用法代码示例 命名规范 ​ 1、变量和函数名:使用驼峰命名法(camelCase),如userName、getUserInfo。 ​ 2、常量:使用全大写字母,…

VSCode安装以及安装你需要的插件的保姆级教程

文章目录 前言vscode的简介安装vscode下载安装包 安装中文插件安装C/C插件总结 前言 Visual Studio Code(VSCode)是一款免费、开源且强大的代码编辑器,它具有易于使用的界面和丰富的功能,包括高级代码编辑、导航、调试等功能。VS…

linux高级编程(广播与组播)

广播与组播: 广播: 局域网,一个人发所有人都能收(服务器找客户端),(发给路由器的广播地址后后路由器自动给所有人发,可用于服务器找客户端) 只能udp来做 setsocketopt…

远程访问及控制(ssh)

目录 一、OpenSSH服务器 1.1 SSH(Secure Shell)协议 1.2 OpenSSH 2.1 SSH原理 2.1 1 公钥传输原理 2.1.2 加密原理 2.1.3 SSHD服务的两种验证方式 二、SSH命令中的基本操作 2.1 构建密钥对验证的SSH 2.1.1 公钥和密钥的关系 2.1.2 构建密钥对…

找不到d3dx9_43.dll怎么办,总结5种解决d3dx9_43.dll丢失的方法

很多人经常使用电脑的时候可能遇到过电脑缺失d3dx9_43.dll的情况。这种情况通常是由于不当操作导致病毒感染或软件误删等原因引起的。今天,我将为大家详细讲解电脑缺失d3dx9_43.dll的原因以及几种解决方法。 一、了解d3dx9_43.dll是什么及作用 d3dx9_43.dll 是一个…

腾讯开源 tlbs-map 地图组件库

腾讯宣布开源 tlbs-map,一个基于腾讯位置服务地图 API 开发的 web 端地图组件库,支持在网页绘制地图并在地图上绘制点、线、面、热力图等效果,支持 Vue2、Vue3、React 等业界主流技术栈,旨在帮助开发者低成本开发地图业务 Javascr…

大模型/NLP/算法面试题总结6——为什么会产生梯度消失和梯度爆炸?

梯度消失和梯度爆炸是深度学习中常见的问题,它们主要发生在神经网络的训练过程中,尤其是在使用反向传播算法进行权重更新时。以下是对这两个问题产生原因的详细分析: 一、梯度消失的原因 深层网络结构: 当神经网络层数过多时&am…

c语言-逻辑运算符和逻辑表达式

一 认识三个逻辑运算符 1.&& “逻辑与” 一假则假 2.|| “逻辑或” 一真则真 3.! “逻辑非” 逻辑与和逻辑或都是双目运算符,要求两个操作数;逻辑非为单目运算符 优先级为 !> 算术运算符 > 关系运算符 > &am…

【Blockly图形化积木编程二次开发学习笔记】1.工具箱的实现

文章目录 Blockly 版本选择上手 Blockly 版本选择 在【兰州大学】Blockly创意趣味编程【全36讲】主讲教师:崔向平 周庆国中提到,在18年6月份之前的版本中,可以通过安装依赖库的方式,打开开发者工具的离线版本,但是新版…

框架设计MVVM

重点&#xff1a; 1.viewmodel 包含model 2.view包含viewmodel,通过驱动viewmodel去控制model的数据和业务逻辑 // Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <vector>using namespace std;#p…

iSCSI 网络存储服务部署

一、介绍 iSCSI &#xff08;Internet Small Computer System Interface&#xff09;&#xff0c;互联网小型计算机系统接口&#xff1b;iSCSI 是SCSI接口 与以太网技术相结合的新型存储技术&#xff0c;属于ip san的一种&#xff0c;可以用来在网络中传输 SCSI 接口的命令和数…

将一个Git仓库地址上传到多个远程仓库

大家好&#xff0c;我是邵奈一&#xff0c;一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为&#xff1a;被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年&#xff0c;我整理了很多IT技术相关的教程给大家&#xff0…

逆向案例二十一——sm2加密,某信登录密码加密

网址&#xff1a;电信账号登录 这个登陆页面&#xff0c;会需要过滑块验证码&#xff0c;先不管他&#xff0c;直接找到登陆包&#xff0c;在登陆包之前&#xff0c;有一个这个包返回一串不知道啥作用的先记着。 找到登陆包&#xff0c;密码进行了加密 用xhr断点调试&#xff…

Jmeter常用组件及执行顺序

一 常用组件 1.线程组 Thread Group 线程组是一系列线程的集合&#xff0c;每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中&#xff0c;每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中&#xff0c;线程组组件运行用户设置线程数量、初始化方式等…

JuiceFS、Ceph 和 MinIO 结合使用

1. 流程图 将 JuiceFS、Ceph 和 MinIO 结合使用&#xff0c;可以充分利用 Ceph 的分布式存储能力、JuiceFS 的高性能文件系统特性&#xff0c;以及 MinIO 提供的对象存储接口。以下是一个方案&#xff0c;介绍如何配置和部署 JuiceFS 使用 Ceph 作为其底层存储&#xff0c;并通…