栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数字图像 x Python-DFT简易滤波

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数字图像 x Python-DFT简易滤波

import cv2  # 加载OPENCV模块
import numpy as np  # 加载numpy模块


def grey_scale(image):
    img_gray = image
    rows, cols = img_gray.shape
    flat_gray = img_gray.reshape((cols * rows,)).tolist()
    A = min(flat_gray)
    B = max(flat_gray)
    print('A = %d,B = %d' % (A, B))
    output = np.uint8(255 / (B - A) * (img_gray - A) + 0.5)
    return output


def DFT(img):  # DFT函数
    Gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 以灰度模式读入图像
    row, height = Gray_img.shape  # 读取图像的大小
    F1 = cv2.dft(np.float32(Gray_img), flags=cv2.DFT_COMPLEX_OUTPUT)  # 将图像转为float32,并进行傅里叶正变换
    F1_shift = np.fft.fftshift(F1)  # 利用np中的fftshift函数进行频谱搬移
    F1img = np.log(cv2.magnitude(F1_shift[:, :, 0], F1_shift[:, :, 1]))  # 提取幅度谱,对数运算是为了增强显示效果
    cf = 30  # 截止频率
    crow, cheight = int(row / 2), int(height / 2)  # 计算频谱中心
    mask = np.zeros((row, height, 2), np.uint8)  # 生成rows行cols列的矩阵,数据格式为uint8
    for i in range(row):  # 对图像进行行遍历
        for j in range(height):  # 对图像进行列遍历
            if np.sqrt(i * i + j * j) <= cf:
                # 将距离频谱中心小于D的部分低通信息设置为1,属于低通滤波
                mask[crow - cf:crow + cf, cheight - cf:cheight + cf] = 1
    low_mask = mask  # 低通滤波器掩膜处理
    high_mask = 1 - mask  # 高通滤波器掩膜处理
    low_shift = np.fft.fftshift(F1_shift * low_mask)  # 逆变换前再进行频谱搬移,将频谱搬回原位
    low = cv2.idft(low_shift)  # 进行傅里叶逆变换
    low_img = cv2.magnitude(low[:, :, 0], low[:, :, 1])  # 提取幅度谱,得到逆变换后的图像
    F2 = cv2.dft(np.float32(low_img), flags=cv2.DFT_COMPLEX_OUTPUT)  # 将图像转为float32,并进行傅里叶正变换
    F2img = np.log(cv2.magnitude(F2[:, :, 0], F2[:, :, 1]))  # 提取幅度谱,对数运算是为了增强显示效果
    high_shift = np.fft.fftshift(F1_shift * high_mask)  # 逆变换前再进行频谱搬移,将频谱搬回原位
    high = cv2.idft(high_shift)  # 进行傅里叶逆变换
    high_img = cv2.magnitude(high[:, :, 0], high[:, :, 1])  # 提取幅度谱,得到逆变换后的图像
    F3 = cv2.dft(np.float32(high_img), flags=cv2.DFT_COMPLEX_OUTPUT)  # 将图像转为float32,并进行傅里叶正变换
    F3img = np.log(cv2.magnitude(F3[:, :, 0], F3[:, :, 1]))  # 提取幅度谱,对数运算是为了增强显示效果
    cv2.imshow('img', img)  # 显示原图像
    cv2.imshow('F1img', grey_scale(F1img))  # 显示幅度谱,grey_scale是灰度拉伸函数
    cv2.imshow('low_img', grey_scale(low_img))  # 显示低通滤波后的图像
    cv2.imshow('F2img', grey_scale(F2img))  # 显示逆变换后的图像,也需要灰度拉伸
    cv2.imshow('high_img', grey_scale(high_img))  # 显示高通滤波后的图像
    cv2.imshow('F3img', grey_scale(F3img))  # 显示逆变换后的图像,也需要灰度拉伸
    cv2.waitKey(0)  # 等待时间
    cv2.destroyAllWindows()  # 关闭所有创建的窗口


if __name__ == '__main__':  # 主函数
    img = cv2.imread('desert.jpg')  # 读取图像
    DFT(img)  # 调用DFT函数
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号