python理想低通滤波、巴特沃斯低通滤波、高斯低通滤波实现

代码

代码如下(示例):

import numpy as np
import cv2 as cv
image = cv.imread('2.PNG')
# print(image.shape)
image = cv.cvtColor(image,cv.COLOR_BGR2GRAY)#图像灰度图
# print(image.shape)
def frequency_filter(image ,filter):
    """
    :param image:
    :param filter: 频域变换函数
    :return:
    """
    fftImg = np.fft.fft2(image) #对图像进行傅里叶变换
    fftImgShift = np.fft.fftshift(fftImg)#傅里叶变换后坐标移动到图像中心
    handle_fftImgShift1 = fftImgShift*filter#对傅里叶变换后的图像进行频域变换

    handle_fftImgShift2 = np.fft.ifftshift(handle_fftImgShift1)
    handle_fftImgShift3 = np.fft.ifft2(handle_fftImgShift2)
    handle_fftImgShift4 = np.real(handle_fftImgShift3)#傅里叶反变换后取频域
    return np.uint8(handle_fftImgShift4)

def ILPF(image,d0,n):#理想低通滤波器
    H = np.empty_like(image,dtype=float)
    M,N = image.shape
    mid_x = int(M/2)
    mid_y = int(N/2)
    for y in range(0, M):
        for x in range(0,N):
            d = np.sqrt((x - mid_x) ** 2 + (y - mid_y) ** 2)
            if d <= d0:
                H[y, x] = 1**n
            else:
                H[y, x] = 0**n
    return H

def BLPF(image,d0,n):#巴特沃斯低通滤波器
    H = np.empty_like(image,float)
    M,N = image.shape
    mid_x = int(M/2)
    mid_y = int(N/2)
    for y in range(0, M):
        for x in range(0, N):
            d = np.sqrt((x - mid_x) ** 2 + (y - mid_y) ** 2)
            H[y,x] = 1/(1+(d/d0)**(n))
    return H

def GLPF(image,d0,n):#高斯低通滤波器
    H = np.empty_like(image,float)
    M, N = image.shape
    mid_x = M/2
    mid_y = N/2
    for x in range(0, M):
        for y in range(0, N):
            d = np.sqrt((x - mid_x)**2 + (y - mid_y) ** 2)
            H[x, y] = np.exp(-d**n/(2*d0**n))
    return H


def image_arrage(image,W,H,n,d0,step,filter):#图像绘制
    """
    :param image: 原始图像
    :param W: 每列图像个数
    :param H: 每行图像个数
    :param n: 阶数
    :param d0: 初始截止频率
    :param step: 截止频率步距
    :return: None
    """
    imageHstack = {}
    for i in range(H):
        hStack = 'H'+str(i)
        flag = 0
        for i in range(W):
            if flag ==0:
                imageHstack[hStack] = frequency_filter(image,filter(image,d0,n))
                d0 += step
                flag +=1
            else:
                imageHstack[hStack] = np.hstack((imageHstack[hStack], frequency_filter(image, filter(image, d0, n))))
                d0 += step
                flag += 1
    flag = 0
    for i in imageHstack.values():

        if  flag == 0:
            imageStack = i
            flag += 1
        else:
            imageStack = np.vstack((imageStack,i))
    # print(imageStack)
    return imageStack



# cv.namedWindow('Img')
# cv.resizeWindow('Img',(20,20))
# cv.imshow('Img',frequency_filter(image,ILPF(image,60)))
# cv.namedWindow('Img2')
# cv.resizeWindow('Img2',(20,20))
# cv.imshow('Img2',frequency_filter(image,BLPF(image,40,n=2)))
# cv.namedWindow('Img3')
# cv.resizeWindow('Img3',(20,20))
# imghstack = np.hstack((imgroi, imgwomen))
# # 垂直组合
# imgvstack = np.vstack((imgroi, imgwomen))
cv.imshow('Img3',image_arrage(image,4,2,2,30,20,BLPF))

# cv.resizeWindow('Img3',(20,20))
# cv.imshow('Img3',frequency_filter(image,GLPF(image,80,n=2)))
cv.waitKey()

高斯低通滤波结果

在这里插入图片描述

  • 16
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

6.11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值