目录
获取最优的DFT大小 (getOptimalDFTSize)
[执行离散傅里叶变换 (dft) 和 逆变换 (idft)](#执行离散傅里叶变换 (dft) 和 逆变换 (idft))
http://t.csdnimg.cn/i8pqt ------ opencv---常用函数学习_"干货"_总(VIP)
散的正在一部分一部分发,不需要VIP。
资料整理不易,有用话给个赞和收藏吧。
二五、霍夫变换
在OpenCV中,霍夫变换是一种常用的图像处理技术,用于检测图像中的几何形状,如直线和圆。OpenCV提供了三个主要的霍夫变换函数:HoughLines
、HoughLinesP
和 HoughCircles
。下面介绍这些函数及其使用示例。
|------------|-------------|--------------|
| 霍夫变换函数 |||
| HoughLines | HoughLinesP | HoughCircles |
| 检测图像中的直线 | 检测图像中的直线段 | 检测图像中的圆 |
检测图像中的直线 (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提供了几个主要的傅里叶变换相关函数:getOptimalDFTSize
、dft
和 idft
。下面介绍这些函数及其使用示例。
|---------------------|-----------|------------|
| 傅里叶变换函数 |||
| getOptimalDFTSize | dft | idft |
| 获取最优的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中的傅里叶变换函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理任务。