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

news/2024/8/26 18:00:31 标签: opencv, 学习, 人工智能

目录

二五、霍夫变换

检测图像中的直线 (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 * rho
        y0 = b * rho
        x1 = 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.niftyadmin.cn/n/5558295.html

相关文章

软设之模板方法模式

设计模式中模板方法模式的意图是:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。 打个比方,比如要制作蛋糕,有准备材料,搅拌材料&#xff0c…

技术速递|Let’s Learn .NET Aspire – 开始您的云原生之旅!

作者:James Montemagno 排版:Alan Wang Let’s Learn .NET 是我们全球性的直播学习活动。在过去 3 年里,来自世界各地的开发人员与团队成员一起学习最新的 .NET 技术,并参加现场研讨会学习如何使用它!最重要的是&#…

昇思25天学习打卡营第16天|Vision Transformer图像分类

本节使用Vision Transfomer完成图像分类 相关知识 Vision Transformer ViT是计算机视觉和自然语言处理两个领域的融合成果。它使用transformer架构来处理图像数据,这种架构原本是用于处理自然语言的。 ViT的主要思想是将图像分割成固定大小的块(patch…

JuiceFS缓存特性

缓存 对于一个由对象存储和数据库组合驱动的文件系统,缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存,再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互,采用缓存技…

llama.cpp

文章目录 一、关于 llama.cpp支持的模型:Multimodal models:Bindings:UI:Tools: 二、Demo1、Typical run using LLaMA v2 13B on M2 Ultra2、Demo of running both LLaMA-7B and whisper.cpp on a single M1 Pro MacBook 三、用法1、基本用法2、对话模式3、网络服务…

React Native 自定义 Hook 获取组件位置和大小

在 React Native 中自定义 Hook useLayout 获取 View、Pressable 等组件的位置和大小的信息 import {useState, useCallback} from react import {LayoutChangeEvent, LayoutRectangle} from react-nativeexport function useLayout() {const [layout, setLayout] useState&l…

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块(XD-MDEP100)是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包,实现不同厂家的设备之间的数据交换和共享。在汇川P…

【力扣】重排链表

一、题目描述 题目链接: . - 力扣(LeetCode) 二、解题思路 找到链表的中间节点,将链表分为两部分(可使用快慢双指针)将后半部分链表逆序(双指针或头插法)合并两个链表 一定要注意…