模糊图像判断

模糊图像判断方法
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}")

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值