精华内容
下载资源
问答
  • 今天小编就为大家分享一篇python实现低通滤波器代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 滤波器_理想低通滤波器python案例

    千次阅读 2018-11-12 17:18:32
    一:基于opencv傅立叶变换的低通滤波 #导入相关库 import cv2 import numpy as np import matplotlib.pyplot as plt #使用cv2 读入图片 new_img=cv2.imread('person.jpg',0) #pencv中的傅立叶变化 dft=cv2.dft(np....

    一:基于opencv傅立叶变换的低通滤波

    #导入相关库
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    #使用cv2 读入图片
    new_img=cv2.imread('person.jpg',0)
    
    #pencv中的傅立叶变化
    dft=cv2.dft(np.float32(new_img),flags=cv2.DFT_COMPLEX_OUTPUT)
    dtf_shift=np.fft.fftshift(dft) 
    #np.fft.fftshift()函数来实现平移,让直流分量在输出图像的重心 
    
    rows,cols=new_img.shape 
    crow,ccol=int(rows/2),int(cols/2) #计算频谱中心
    mask=np.zeros((rows,cols,2),np.uint8) #生成rows行cols列的2纬矩阵,数据格式为uint8 
    mask[crow-30:crow+30,ccol-30:ccol+30]=1 #将靠近频谱中心的部分低通信息 设置为1,属于低通滤波
    fshift=dtf_shift*mask
    
    #傅立叶逆变换
    f_ishift=np.fft.ifftshift(fshift) 
    img_back=cv2.idft(f_ishift) 
    img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) #计算像素梯度的绝对值
    img_back=np.abs(img_back)
    img_back=(img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back))
    
    plt.figure(figsize=(15,15))
    plt.subplot(121),plt.imshow(new_img,cmap='gray'),plt.title('input image')
    plt.subplot(122),plt.imshow(img_back,cmap='gray'),plt.title('output image')
    

    输出结果为:
    在这里插入图片描述

    2.基于numpy傅立叶变换的低通滤波

    #导入相关库
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    #使用cv2 读入图片
    new_img=cv2.imread('person.jpg',0)
    
    #numpy中的傅立叶变化
    f1=np.fft.fft2(new_img)
    f1_shift=np.fft.fftshift(f1) 
    #np.fft.fftshift()函数来实现平移,让直流分量在输出图像的重心 
    
    rows,cols=new_img.shape 
    crow,ccol=int(rows/2),int(cols/2) #计算频谱中心
    mask=np.zeros((rows,cols),np.uint8) #生成rows行cols的矩阵,数据格式为uint8 
    mask[crow-30:crow+30,ccol-30:ccol+30]=1 #将靠近频谱中心的部分低通信息 设置为1,属于低通滤波
    f1_shift=f1_shift*mask
    
    #傅立叶逆变换
    f_ishift=np.fft.ifftshift(f1_shift) 
    img_back=np.fft.ifft2(f_ishift) 
    img_back=np.abs(img_back)
    img_back=(img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back))
    
    plt.figure(figsize=(15,15))
    plt.subplot(121),plt.imshow(new_img,cmap='gray'),plt.title('input image')
    plt.subplot(122),plt.imshow(img_back,cmap='gray'),plt.title('output image')
    

    输出结果为:
    在这里插入图片描述

    展开全文
  • 对图像进行频域滤波的几种常用低通滤波器python-opencv实现: 低通滤波器(Low-pass filter)容许低频信号通过,但减弱频率高于截止频率的信号的通过。对于不同滤波器而言,每个频率的信号的减弱程度不同。当使用...

    对图像进行频域滤波的几种常用低通滤波器,python-opencv实现:

    低通滤波器(Low-pass filter)容许低频信号通过,但减弱频率高于截止频率的信号的通过。对于不同滤波器而言,每个频率的信号的减弱程度不同。当使用在音频应用时,它有时被称为高频剪切滤波器,或高音消除滤波器。

    H ( u , v ) H(u, v) H(u,v)为滤波器, D ( u , v ) D(u, v) D(u,v)为像素点到参考点的距离, D 0 D_0 D0为滤波器半径。

    理想低通滤波器
    H ( u , v ) = { 1 D ( u , v ) ≤ D 0 0 D ( u , v ) > D 0 H(u, v) = \left\{ \begin{array}{ccc} 1 & D(u, v) \le D_0\\ 0 & D(u, v) > D_0\end{array} \right. H(u,v)={10D(u,v)D0D(u,v)>D0

    import cv2 as cv
    import numpy as np
    
    def ILPF(shape, radius):
    	mask = np.zeros(shape[:2], dtype=np.uint8)
    	cv.circle(mask, (int(w / 2), int(h / 2)), radius, (255, 255, 255), -1)
    	return mask
    
    # 示意图
    cv.imshow('ilpf', ILPF((900, 900), 30))
    

    示意图:
    理想低通滤波器

    butterworth巴特沃斯滤波器
    巴特沃斯滤波器的特点是通频带(passband)内的频率响应曲线最大限度平坦,没有涟波,而在阻频带则逐渐下降为零。

    一阶巴特沃斯滤波器的衰减率为每倍频6 dB,每十倍频20 dB(所有一阶低通滤波器具有相同的归一化频率响应)。二阶巴特沃斯滤波器的衰减率为每倍频12 dB、 三阶巴特沃斯滤波器的衰减率为每倍频18 dB、如此类推。巴特沃斯滤波器的振幅是 ω 的一个单调函数,并且也是唯一的无论阶数,振幅对角频率曲线都保持同样的形状的滤波器。只不过滤波器阶数越高,在阻频带振幅衰减速度越快。其他滤波器高阶的振幅对角频率图和低级数的振幅对角频率有不同的形状。
    H ( u , v ) = 1 1 + ( D ( u , v ) D 0 ) 2 n H(u, v) = \frac{1}{1 + (\frac{D(u, v)}{D_0})^{2n}} H(u,v)=1+(D0D(u,v))2n1

    def butterworth_filter(shape, rank, radius):
        """ butterworth filter genreator
    
        H(u, v) = 1 / (1 + (D(u, v) / radius)^(2 * rank))
        Args:
            shape:  滤波器的形状
            rank:   滤波器阶数
            radius: 滤波器半径
        """
        # 中心位置
        h, w = shape[:2]
        cx, cy = int(w / 2), int(h / 2)
        # 计算以中心为原点坐标分量
        u = np.array([[x - cx for x in range(w)] for i in range(h)], dtype=np.float32)
        v = np.array([[y - cy for y in range(h)] for i in range(w)], dtype=np.float32).T
        # 每个点到中心的距离
        dis = np.sqrt(u * u + v * v)
        filt = 1 / (1 + np.power(dis / radius, 2 * rank))
        return filt
    

    一、二阶滤波器
    一阶巴特沃斯滤波器二阶巴特沃斯滤波器
    高斯滤波器
    高斯滤波器的过度特性非常平坦,不会产生振铃现象(二维高斯分布)
    H ( u , v ) = e − 1 2 ⋅ ( D ( u , v ) D 0 ) 2 H(u, v) = e^{-\frac{1}{2}\cdot (\frac{D(u, v)}{D_0})^2} H(u,v)=e21(D0D(u,v))2

    def gaussian_filter(shape, sigma):
        """ Gaussian Low Pass filter
    	Args:
    		shape: 滤波器形状
    		sigma: sigma值(半径)
        H(u, v) = e^(-(u^2 + v^2) / (2 * sigma^2))
        """
        h, w = shape[: 2]
        cx, cy = int(w / 2), int(h / 2)
        u = np.array([[x - cx for x in range(w)] for i in range(h)], dtype=np.float32)
        v = np.array([[y - cy for y in range(h)] for i in range(w)], dtype=np.float32).T
        dis2 = u * u + v * v
        p = -dis2 / (2 * sigma**2)
        #filt = 1 / (2 * pi * sigma**2) * np.exp(p)
        filt = np.exp(p)
        return filt
    

    高斯滤波器

    展开全文
  • 首先看个图了解下什么是理想低通滤波器公式和图是转自Rolin的专栏 低通滤波器   1.理想的低通滤波器  其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离,很简单就能得到。  使用低...

    首先看个图了解下什么是理想低通滤波器公式和图是转自Rolin的专栏

    低通滤波器


            1.理想的低通滤波器


           其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离,很简单就能得到。

           使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分,所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻,所以会产生了振铃现象。


            2.巴特沃斯低通滤波器

           同样的,D0表示通带的半径,n表示的是巴特沃斯滤波器的次数。随着次数的增加,振铃现象会越来越明显。

       

    void ideal_Low_Pass_Filter(Mat src){
    	Mat img;
    	cvtColor(src, img, CV_BGR2GRAY);
    	imshow("img",img);
    	//调整图像加速傅里叶变换
    	int M = getOptimalDFTSize(img.rows);
    	int N = getOptimalDFTSize(img.cols);
    	Mat padded;
    	copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));
    	//记录傅里叶变换的实部和虚部
    	Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
    	Mat complexImg;
    	merge(planes, 2, complexImg);
    	//进行傅里叶变换
    	dft(complexImg, complexImg);
    	//获取图像
    	Mat mag = complexImg;
    	mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));//这里为什么&上-2具体查看opencv文档
    	//其实是为了把行和列变成偶数 -2的二进制是11111111.......10 最后一位是0
    	//获取中心点坐标
    	int cx = mag.cols / 2;
    	int cy = mag.rows / 2;
    	//调整频域
    	Mat tmp;
    	Mat q0(mag, Rect(0, 0, cx, cy));
    	Mat q1(mag, Rect(cx, 0, cx, cy));
    	Mat q2(mag, Rect(0, cy, cx, cy));
    	Mat q3(mag, Rect(cx, cy, cx, cy));
    
    	q0.copyTo(tmp);
    	q3.copyTo(q0);
    	tmp.copyTo(q3);
    
    	q1.copyTo(tmp);
    	q2.copyTo(q1);
    	tmp.copyTo(q2);
    	//Do为自己设定的阀值具体看公式
    	double D0 = 60;
    	//处理按公式保留中心部分
    	for (int y = 0; y < mag.rows; y++){
    		double* data = mag.ptr<double>(y);
    		for (int x = 0; x < mag.cols; x++){
    			double d = sqrt(pow((y - cy),2) + pow((x - cx),2));
    			if (d <= D0){
    				
    			}
    			else{
    				data[x] = 0;
    			}
    		}
    	}
    	//再调整频域
    	q0.copyTo(tmp);
    	q3.copyTo(q0);
    	tmp.copyTo(q3);
    	q1.copyTo(tmp);
    	q2.copyTo(q1);
    	tmp.copyTo(q2);
    	//逆变换
    	Mat invDFT, invDFTcvt;
    	idft(mag, invDFT, DFT_SCALE | DFT_REAL_OUTPUT); // Applying IDFT
    	invDFT.convertTo(invDFTcvt, CV_8U);
    	imshow("理想低通滤波器", invDFTcvt);
    }
    
    void Butterworth_Low_Paass_Filter(Mat src){
    	int n = 1;//表示巴特沃斯滤波器的次数
    	//H = 1 / (1+(D/D0)^2n)
    	Mat img;
    	cvtColor(src, img, CV_BGR2GRAY);
    	imshow("img", img);
    	//调整图像加速傅里叶变换
    	int M = getOptimalDFTSize(img.rows);
    	int N = getOptimalDFTSize(img.cols);
    	Mat padded;
    	copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));
    
    	Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
    	Mat complexImg;
    	merge(planes, 2, complexImg);
    
    	dft(complexImg, complexImg);
    
    	Mat mag = complexImg;
    	mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));
    
    	int cx = mag.cols / 2;
    	int cy = mag.rows / 2;
    
    	Mat tmp;
    	Mat q0(mag, Rect(0, 0, cx, cy));
    	Mat q1(mag, Rect(cx, 0, cx, cy));
    	Mat q2(mag, Rect(0, cy, cx, cy));
    	Mat q3(mag, Rect(cx, cy, cx, cy));
    
    	q0.copyTo(tmp);
    	q3.copyTo(q0);
    	tmp.copyTo(q3);
    
    	q1.copyTo(tmp);
    	q2.copyTo(q1);
    	tmp.copyTo(q2);
    
    	double D0 = 100;
    
    	for (int y = 0; y < mag.rows; y++){
    		double* data = mag.ptr<double>(y);
    		for (int x = 0; x < mag.cols; x++){
    			//cout << data[x] << endl;
    			double d = sqrt(pow((y - cy), 2) + pow((x - cx), 2));
    			//cout << d << endl;
    			double h = 1.0 / (1 + pow(d / D0, 2 * n));
    			if (h <= 0.5){
    				data[x] = 0;
    			}
    			else{
    				//data[x] = data[x]*0.5;
    				//cout << h << endl;
    			}
    			
    			//cout << data[x] << endl;
    		}
    	}
    	q0.copyTo(tmp);
    	q3.copyTo(q0);
    	tmp.copyTo(q3);
    	q1.copyTo(tmp);
    	q2.copyTo(q1);
    	tmp.copyTo(q2);
    	//逆变换
    	Mat invDFT, invDFTcvt;
    	idft(complexImg, invDFT, DFT_SCALE | DFT_REAL_OUTPUT); // Applying IDFT
    	invDFT.convertTo(invDFTcvt, CV_8U);
    	imshow("巴特沃斯低通滤波器", invDFTcvt);
    }


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    展开全文
  • 上一章中学习了一维离散傅里叶变换的概念和实现... 得到的图片的效果比起理想低通滤波要更好一些,对于图像的细节保留的更好一点,也显得更加平滑,不会像前者那样有波纹。            

           上一章中学习了一维离散傅里叶变换的概念和实现。但在具体的图像中实现还是有点不足,首先我们需要输入图像的尺寸都是2的整数次幂,这个条件太过苛刻了,如果使用Resize又会损失信息。目前还是以熟悉为主,所以选择用numpy自带的方法来进行频域的转换。

           那么很简单的,首要就是试一下把一张图片从空间域转换到频域上,然后在频域上分解成幅度谱和相位谱,然后再反过来利用幅度谱和相位谱合成一张图片。实现的代码如下,主要是使用numpy自带的函数,numpy.abs计算复数的绝对值,numpy.angle计算相位值。

    from PIL import Image
    import numpy as np
    
    girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
    newgirl = "C:/Users/60214/Desktop/python_work/DigitalExecution/newgirl.jpg"
    
    im = Image.open(girl)
    im_arr = np.array(im)
    
    fft = np.fft.fft2(im_arr)
    phase = np.angle(fft)
    amplitude = np.abs(fft)
    
    new_fft = np.zeros(amplitude.shape, dtype = "complex64")
    
    for i in range(new_fft.shape[0]):
    	for j in range(new_fft.shape[1]):
    		new_fft[i, j] = amplitude[i, j] * np.exp(complex(0, phase[i, j]))
    
    new_fft = np.fft.ifft2(new_fft)
    
    new_fft = np.abs(new_fft)
    
    new_arr = np.zeros(new_fft.shape, dtype = "uint8")
    
    for i in range(new_fft.shape[0]):
    	for j in range(new_fft.shape[1]):
    		new_arr[i, j] = new_fft[i, j]
    
    new_im = Image.fromarray(new_arr)
    new_im.save(newgirl)

           然后可以做一个有趣的实验,即把两张图片转换后的幅度谱和相位谱交换,看生成的新图片是什么样子的,可以帮助我们更好的理解幅度谱和相位谱到底代表了图片在时域上的什么内容。

    from PIL import Image
    import numpy as np
    
    man = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_man.jpg"
    woman = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_woman.jpg"
    
    a = Image.open(man)
    a = a.resize((800, 800))
    a = np.array(a)
    a = np.fft.fft2(a)
    a_phase = np.angle(a)
    a_amplitude = np.abs(a)
    
    b = Image.open(woman)
    b = b.resize((800, 800))
    b = np.array(b)
    b = np.fft.fft2(b)
    b_phase = np.angle(b)
    b_amplitude = np.abs(b)
    
    #build picture for a_phase and b_amplitude
    aa = np.zeros((800,800), dtype = "complex64")
    for i in range(800):
    	for j in range(800):
    		aa[i, j] = b_amplitude[i, j] * np.exp(complex(0, a_phase[i, j]))
    aa = np.fft.ifft2(aa)
    aa = np.abs(aa)
    aaa  = np.zeros((800, 800), dtype = "uint8")
    for i in range(800):
    	for j in range(800):
    		aaa[i,j] = aa[i, j]
    aaa_im = Image.fromarray(aaa)
    aaa_im.save("C:/Users/60214/Desktop/python_work/DigitalExecution/mix1.jpg")
    
    #build picture for b_phase and a_amplitude
    bb = np.zeros((800,800), dtype = "complex64")
    for i in range(800):
    	for j in range(800):
    		bb[i, j] = a_amplitude[i, j] * np.exp(complex(0, b_phase[i, j]))
    bb = np.fft.ifft2(bb)
    bb = np.abs(bb)
    bbb  = np.zeros((800, 800), dtype = "uint8")
    for i in range(800):
    	for j in range(800):
    		bbb[i,j] = bb[i, j]
    bbb_im = Image.fromarray(bbb)
    bbb_im.save("C:/Users/60214/Desktop/python_work/DigitalExecution/mix2.jpg")

             从代码中,我们知道图片mix1,使用男头的相位谱和女头的幅度谱合成的,而图片中看得出图片的内容是男士头像,也符合之前说的相位谱决定图像结构的论断。至于幅度图,更多的决定了图片的明暗和灰度变化趋势,从图中仔细看确实看得出mix1的明暗和女头图片中的明暗是对应的。

           接下来看一下频率滤波的基本步骤:

    1.计算原始图像f(x,y)的DFT,得到F(u,v)

    2.将频谱F(u,v)的零频点移动到频谱图的中心位置

    3.计算滤波器函数H(u,v)和F(u,v)的乘积G(u,v)

    4.将频谱G(u,v)的零频点移动到频谱图的左上角位置上

    5.计算第四步结果的逆傅里叶变化得到g(x,y)

    6.取实部作为最终结果

           对于为什么要把频谱F(u,v)的零频点移动到频谱图的中心位置,我的理解是,首先从周期性出发,我们知道四个顶点的数值必然都是F(0,0),这是指导我们对角互换的一个思路。其次,平移之后低频点都集中在图像中心,而越接近边缘则频率越高,方便我们设置滤波函数。这个可以通过numpy.fft.fftshift和numpy.fft.ifftshift来实现。

         在频谱中,低频主要对应了图像在平滑区域的总体灰度级分布,而高频对应图像的细节部分例如边缘噪声。因此图像平滑可以通过衰减图像频谱中的高频部分来实现,这就建立起了空间域图像平滑和频域低通滤波之间的对应关系。最直接的方法就是设置一个截止频率,高于此频率的频谱成分置为0,低于的保存,这就是理想的低通滤波器,如果图像的宽为M,高为N,其H(u,v)的表现形式为

    H(u,v)=\left\{\begin{matrix} 1, [(u-\frac{M}{2})^{2}+(v-\frac{N}{2})^{2}]\leq D_{0}^{2}\\ 0, [(u-\frac{M}{2})^{2}+(v-\frac{N}{2})^{2}]> D_{0} ^{2}\end{matrix}\right.

          实现的代码为

    from PIL import Image
    import numpy as np
    import matplotlib.pyplot as plt
    
    girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
    
    im = Image.open(man)
    imarr = np.array(im)
    height, width = imarr.shape
    
    fft = np.fft.fft2(imarr)
    fftshift = np.fft.fftshift(fft)
    
    cutstop = 20
    
    for i in range(height):
    	for j in range(width):
    		if (i - (height - 1)/2)**2 + (j - (width - 1)/2)**2 >= cutstop**2:
    			fftshift[i, j] = 0
    
    fftshift = np.fft.ifftshift(fftshift)
    ifft = np.fft.ifft2(fftshift)
    
    new = np.zeros((height, width), dtype = "uint8")
    
    for i in range(height):
    	for j in range(width):
    		new[i, j] = ifft[i, j].real
    
    new_im = Image.fromarray(new)
    new_im.save("C:/Users/60214/Desktop/python_work/DigitalExecution/girl1.jpg")
    

              我们来对比图片前后的变化,可以看到图片确实被平滑了许多,平滑的程度我们可以通过改变截断的范围来控制,截断的频率越低,图片就越平滑。就效果而言,有点类似于空间域滤波中的平滑滤波,没有针对性。另外还观察到在图片中有一些黑色块,这个现象我看的教材中并没有出现。发现这些黑色块主要集中在图片中颜色过渡较快的区域,例如图像的边缘处头发、下巴、衣服和头发相连接处等位置,这些位置都是高频区域,受到高频成分削减的影响从而转换回空间域中时数值很接近于0即黑色。但是别人的博客中处理结果也没有出现相似的现象,所以应该还是我哪里写的问题不对。结合之前的经验,这种突然的信息消失很可能与我们设置的numpy.array的数据类型有关,所以我额外多添加了一个数组来盛放逆傅里叶变换后的处理毕的图像像素,其中都是复数,在取得实部的时候如果有一部分实部为负数那么就会被我们的uint8所截断,所以用float64的先储存后再缩放到0-255内再保存到uint8的数组中,来生成图片。新的代码如下所示,虽然有点累赘,但确实没有问题了。

    from PIL import Image
    import numpy as np
    import matplotlib.pyplot as plt
    
    girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
    
    im = Image.open(girl)
    imarr = np.array(im)
    height, width = imarr.shape
    
    fft = np.fft.fft2(imarr)
    fftshift = np.fft.fftshift(fft)
    
    cutstop = 50
    
    for i in range(height):
    	for j in range(width):
    		if (i - (height)/2)**2 + (j - (width)/2)**2 >= cutstop**2:
    			fftshift[i, j] = 0
    
    fftshift = np.fft.ifftshift(fftshift)
    ifft = np.fft.ifft2(fftshift)
    
    new = np.zeros((height, width))
    
    for i in range(height):
    	for j in range(width):
    		new[i, j] = ifft[i, j].real
    
    max = np.max(new)
    min = np.min(new)
    res = np.zeros((height, width), dtype = "uint8")
    
    for i in range(height):
    	for j in range(width):
    		res[i, j] = 255*(new[i, j] - min)/(max - min)
    
    res_im = Image.fromarray(res)
    res_im.save("C:/Users/60214/Desktop/python_work/DigitalExecution/girl1.jpg")
    

             处理后的图像如下,有明显的平滑效果。

              给出高斯低通滤波器的函数式

    H(u,v)=e^{-[(u-\frac{M}{2})^{2}+(v-\frac{N}{2})^{2}]/2\sigma ^{2}}

          试一下用opencv的库来打开和保存图片,而不是用PIL。实现的代码如下:

    import cv2
    import numpy as np
    
    def GaussianFrequencyFilter(src, dst, sigma = 1):
    
    	im = cv2.imread(src, 0)
    	imarr = np.array(im)
    
    	height, width = imarr.shape
    
    	fft = np.fft.fft2(imarr)
    	fft = np.fft.fftshift(fft)
    
    	for i in range(height):
    		for j in range(height):
    			fft[i, j] *= np.exp(-((i - (height - 1)/2)**2 + (j - (width - 1)/2)**2)/2/sigma**2)
    
    	fft = np.fft.ifftshift(fft)
    	ifft = np.fft.ifft2(fft)
    
    	ifft = np.real(ifft)
    	max = np.max(ifft)
    	min = np.min(ifft)
    
    	res = np.zeros((height, width), dtype = "uint8")
    
    	for i in range(height):
    		for j in range(width):
    			res[i, j] = 255 * (ifft[i, j] - min)/(max - min)
    
    	cv2.imwrite(dst, res)
    
    gray_girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
    gaussian_girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gaussian_girl.jpg"
    
    GaussianFrequencyFilter(gray_girl, gaussian_girl, 20)

               得到的图片的效果比起理想低通滤波要更好一些,对于图像的细节保留的更好一点,也显得更加平滑,不会像前者那样有波纹。

     

     

     

     

     

     

    展开全文
  • # 理想低通滤波器 # 导入相关库 from skimage import data, color import numpy as np import matplotlib.pyplot as plt """ 中文显示工具函数 """ def set_ch(): from pylab import mpl mpl.rcParams['font....
  • 主要针对傅里叶正反变换以及其频率域的呈现,以及理想(方形)低通滤波器、Butterworth滤波器的实现,代码费了不少心思,毕竟八百年没碰过matlab了,竟然写到一半开始拼Python了!!!有惊无险,全班第一个完成嘻嘻
  • (2)使用理想低通滤波器,截止频率半径分别选取10、20、50、80,分别显示对应的滤波后图像,并做简要分析; (3)使用理想高通滤波器,截止频率半径分别选取10、20、50、80,分别显示对应的滤波后图像,并做简要...
  • 低频滤波器,顾名思义,就是过滤掉或者大幅度衰减图像的高频成分,让图像的低频成分通过。低频滤波器可以平滑图像,虑去图像的噪声。而与此相反的高频滤波器,则是过滤低频成分,通过高频成分,可以达到锐化图像的...
  • python实现低通滤波器

    万次阅读 2018-12-10 16:22:45
    低通滤波器实验代码,这是参考别人网上的代码,所以自己也分享一下,共同进步 # -*- coding: utf-8 -*- import numpy as np from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt ...
  • 低通滤波器  1.理想的低通滤波器  其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离,很简单就能得到。... 使用低通滤波器所得到的...由于理想低通滤波器的过度特性过于急峻,所以会产生了振铃现象。
  • 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) ...
  • 图像处理 理想低通滤波器Bright, bold, colorful, eye-catching images. Pictures that stop traffic — internet traffic. We see them every day and everywhere we go online. We notice them and, more ...
  • 设计不同截止频率的理想低通滤波器、Butterworth低通滤波器,对其进行频域增强。观察频域滤波效果,并解释之。 (二)频域高通滤波 设计不同截止频率的理想高通滤波器、Butterworth高通滤波器,对上述白条图像进行...
  • 梯形低通滤波器 梯形低通滤波器(TLPF)的传递函数如下: $$ H(u,v) = \begin{cases} 1 & D(u,v) \lt D_0 \\ \frac{D(u,v) - D_1}{D_0-D_1} & D_0 \lt D(u,v) \leq D_1 \\ 0 &D(u,v) > D_1 \end{cases}...
  • 本节将要介绍几种低通滤波器,几种形态学处理方法 一、低通滤波 1.平均值滤波 cv.filter2D() 可以对一幅图像进行卷积操作。下面是一个 5x5 的平均滤波器核:   操作如下:将核放在图像的一个像素 A 上,求与核...
  • 文章目录3.2 Python图像的频域图像增强-高通和低通滤波器1 算法原理1.1理想滤波器1.2巴特沃斯滤波器1.3指数滤波器2 代码3 效果 1 算法原理 高通和低通滤波器(分别考虑:理想滤波器、巴特沃斯滤波器,指数滤波器) ...
  • 目录使用低通频率域滤波器平滑图像理想低通滤波器(ILPF)高斯低通滤波器(GLPF)巴特沃斯低通滤波器低通滤波的例子 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心的一个圆内无衰减地通过所有频率...
  • 理想低通滤波器 理想低通滤波器在以原点为圆心,D0D_0D0​为半径的圆内,通过所有的频率,而在圆外截断所有的频率。其中圆心的频率最低,为变换的直流(DC)分量,函数如下: H(u,v)={1,D(u,v)≤D00,D(u,v)>D0(6-...
  • 常用滤波器 (1)理想滤波器 理想低通滤波器: 理想高通滤波器 (2)butterwoth滤波器 butterwoth低通滤波器: butterwoth高通滤波器: (3)指数滤波器 指数低通滤波 : 指数高通滤波: 4.python实现 import cv2 ...
  • 频域增强(巴特沃斯) 低通滤波器对受噪声干扰的图像进行平滑处理
  • 所谓低通滤波器,顾名思义是指允许低频率的信号通过,而抑制高频率的信号的部件,理想的滤波器是不可能实现的。ButterWorth低通滤波器具有良好的幅频特性以及线性的相位特性而广泛使用。分析低通滤波器通常使用传递...
  • python 理想滤波 巴特沃兹滤波 高斯滤波

    千次阅读 多人点赞 2018-01-19 12:57:04
    网上matlab的图像处理资料非常丰富,python作为一个流行的脚本语言,也具备图像处理能力,其丰富的第三方库为科学计算提供了很大便利,在图像分析领域...opencv 理想滤波、巴特沃兹滤波和高斯滤波的高通、低通滤波演示
  • n阶巴特沃斯低通滤波器,传递函数为: $$ H(u,v) = \frac{1}{1 + (D(u,v) / D_0)^{2n}} \tag{7-1} $$ 其中,D(u,v)=(u−P2)2+(v−Q2)2D(u,v) = \sqrt{(u - \frac{P}{2})^2 + (v - \frac{Q}{2})^2}D(u,v)=(u−2P​)2+...
  • 今天小编就为大家分享一篇关于理想高通滤波实现Python opencv示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • python-opencv实现低通滤波 import os import cv2 import numpy as np import matplotlib.pyplot as plt def read_img(img_7_path): img=cv2.imread(img_7_path,0) dft=cv2.dft(np.float32(img),flags=cv2.DFT_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 713
精华内容 285
关键字:

理想低通滤波器python

python 订阅