当前位置: 首页 > news >正文

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中的傅里叶变换函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理任务。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 常见的排序算法,复杂度
  • jail子系统里升级Ubuntu focal到jammy
  • XML 验证器:确保数据完整性和准确性的关键工具
  • 如何查看极狐GitLab Helm Chart?
  • 用Pytorch实现线性回归(Linear Regression with Pytorch)
  • 基于luckysheet实现在线电子表格和Excel在线预览
  • 防火墙NAT地址转换和智能选举综合实验
  • 代谢组数据分析(十五):基于python语言构建PLS-DA算法构建分类模型
  • LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】
  • springboot系列教程(一):简介与入门案例(含源码)
  • html5——CSS列表样式属性
  • django报错(一):python manage.py makemigrations,显示“No changes detected”
  • android的跨进程通讯方式
  • Qt窗口程序整理汇总
  • 【D3.js in Action 3 精译】第二章 DOM 的操作方法
  • 「面试题」如何实现一个圣杯布局?
  • ERLANG 网工修炼笔记 ---- UDP
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript新鲜事·第5期
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React Native移动开发实战-3-实现页面间的数据传递
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • vue 个人积累(使用工具,组件)
  • Vue2.x学习三:事件处理生命周期钩子
  • 前端面试之闭包
  • 驱动程序原理
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 线上 python http server profile 实践
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Python 之网络式编程
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • #### go map 底层结构 ####
  • #《AI中文版》V3 第 1 章 概述
  • #define 用法
  • #QT(智能家居界面-界面切换)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (2)Java 简介
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)c52学习之旅-流水LED灯
  • (转)setTimeout 和 setInterval 的区别
  • (转)视频码率,帧率和分辨率的联系与区别
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .ai域名是什么后缀?
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net IE10 _doPostBack 未定义
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net Web项目创建比较不错的参考文章
  • .NET 简介:跨平台、开源、高性能的开发平台
  • ?
  • ?.的用法
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解