import cv2
import numpy as np
def compute_dft(image):
"""
计算图像的离散傅里叶变换(DFT)
:param image: 灰度图像(NumPy 数组)
:return: DFT 结果
"""
# 扩展图像到最佳尺寸
rows, cols = image.shape
m = cv2.getOptimalDFTSize(rows)
n = cv2.getOptimalDFTSize(cols)
padded = cv2.copyMakeBorder(image, 0, m - rows, 0, n - cols, cv2.BORDER_CONSTANT, value=0)
# 转换为浮点数并添加一个通道用于存储复数部分
planes = [np.float32(padded), np.zeros(padded.shape, np.float32)]
complexI = cv2.merge(planes)
# 计算 DFT
dft = cv2.dft(complexI)
dft_shift = np.fft.fftshift(dft)
return dft_shift
def compute_magnitude_spectrum(dft_shift):
"""
计算 DFT 的幅度谱
:param dft_shift: DFT 结果(中心化)
:return: 幅度谱
"""
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
return magnitude_spectrum
def blur_detection(gray_image, filter_mask_radius=50, thresh=10):
"""
检测图像的模糊程度
:param gray_image: 灰度图像(NumPy 数组)
:param filter_mask_radius: 低通滤波器的半径
:param thresh: 模糊阈值
:return: 模糊评分
"""
# 计算 DFT
dft_shift = compute_dft(gray_image)
# 创建低通滤波器掩码
rows, cols = gray_image.shape
mask = np.ones((rows, cols), np.uint8)
center = (cols // 2, rows // 2)
cv2.circle(mask, center, filter_mask_radius, 0, -1)
mask = np.fft.fftshift(mask)
# 应用低通滤波器
dft_shift[:, :, 0] *= mask
dft_shift[:, :, 1] *= mask
# 计算逆 DFT
idft_shift = np.fft.ifftshift(dft_shift)
idft = cv2.idft(idft_shift)
img_back = cv2.magnitude(idft[:, :, 0], idft[:, :, 1])
# 计算模糊评分
min_val, max_val = np.min(img_back), np.max(img_back)
if max_val <= 0:
blur_value = 100 # 黑图
return blur_value
img_log = np.log(img_back)
blur_value = np.mean(img_log) * 20
return blur_value
if __name__ == "__main__":
# 示例:加载灰度图像
img_path = "path/to/your/image.jpg"
gray_image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
if gray_image is None:
print("无法加载图像")
exit()
# 检测模糊
blur_value = blur_detection(gray_image)
print(f"模糊评分: {blur_value}")
模糊图像判断
模糊图像判断方法
最新推荐文章于 2025-12-10 08:55:08 发布
17万+

被折叠的 条评论
为什么被折叠?



