gpt4 book ai didi

python - 用于模糊图像的低通滤波器

转载 作者:行者123 更新时间:2023-11-30 21:59:13 26 4
gpt4 key购买 nike

我试图通过传递我创建的低通滤波器来使用 fft 模糊图像,但输出结果是充满灰色噪声的图像。我只是想遵循这里的基础知识,但我的实现似乎有问题:  

from scipy import fftpack
import numpy as np
import imageio
from PIL import Image, ImageDraw

image1 = imageio.imread('image.jpg',as_gray=True)

#convert image to numpy array
image1_np=np.array(image)

#fft of image
fft1 = fftpack.fftshift(fftpack.fft2(image1_np))

#Create a low pass filter image
x,y = image1_np.shape[0],image1_np.shape[1]
#size of circle
e_x,e_y=50,50
#create a box
bbox=((x/2)-(e_x/2),(y/2)-(e_y/2),(x/2)+(e_x/2),(y/2)+(e_y/2))

low_pass=Image.new("L",(image1_np.shape[0],image1_np.shape[1]),color=0)

draw1=ImageDraw.Draw(low_pass)
draw1.ellipse(bbox, fill=255)

low_pass_np=np.array(low_pass)
low_pass_fft=fftpack.fftshift(fftpack.fft2(low_pass))

#multiply both the images
filtered=np.multiply(fft1,low_pass_fft)

#inverse fft
ifft2 = abs(fftpack.ifft2(fftpack.ifftshift(filtered)))

#save the image
imageio.imsave('fft-then-ifft.png', ifft2.astype(np .uint8))

Original Image:

Low Pass filter created

Resultant Image

最佳答案

正如 Cris Luengo 的评论中提到的,有几点需要纠正:

  • 为低通滤波器提供的椭圆形状在频域中有意义,因此您不应该计算其 FFT。
  • 滤波器幅度 255 会将结果缩放相同的量。当您存储如此大的值时,uint8 类型会回绕以仅保留 8 个最低有效位,从而导致看起来像噪声的东西。只需更改过滤器的值即可解决此问题:

    draw1.ellipse(bbox, fill=1)
  • 重新调整缩放比例后,计算出的过滤在图像的某些区域可能仍会稍微超出所需的 0-255 范围。这会产生环绕点(被白色像素包围的区域中的黑色区域、被黑色像素包围的区域中的白色区域,甚至图像从白色到黑色到白色的渐变带)。为了避免这种情况,通常将值限制在 0-255 范围内,如下所示:

    ifft2 = np.real(fftpack.ifft2(fftpack.ifftshift(filtered)))
    ifft2 = np.maximum(0, np.minimum(ifft2, 255))

进行这些更正后,您应该拥有以下代码:

from scipy import fftpack
import numpy as np
import imageio
from PIL import Image, ImageDraw

image1 = imageio.imread('image.jpg',as_gray=True)

#convert image to numpy array
image1_np=np.array(image1)

#fft of image
fft1 = fftpack.fftshift(fftpack.fft2(image1_np))

#Create a low pass filter image
x,y = image1_np.shape[0],image1_np.shape[1]
#size of circle
e_x,e_y=50,50
#create a box
bbox=((x/2)-(e_x/2),(y/2)-(e_y/2),(x/2)+(e_x/2),(y/2)+(e_y/2))

low_pass=Image.new("L",(image1_np.shape[0],image1_np.shape[1]),color=0)

draw1=ImageDraw.Draw(low_pass)
draw1.ellipse(bbox, fill=1)

low_pass_np=np.array(low_pass)

#multiply both the images
filtered=np.multiply(fft1,low_pass_np)

#inverse fft
ifft2 = np.real(fftpack.ifft2(fftpack.ifftshift(filtered)))
ifft2 = np.maximum(0, np.minimum(ifft2, 255))

#save the image
imageio.imsave('fft-then-ifft.png', ifft2.astype(np .uint8))

以及以下过滤后的图像:

enter image description here

关于python - 用于模糊图像的低通滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54641616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com