2

我正在尝试将 numpy 数组转换为 PIL 格式,然后将其显示为标签!我可以为我的原始图像执行此操作,但是在我使用 fft 和 fftshift 之后,我无法正确显示它。!

image1=Image.open('sam.jpg')
image1 = image1.resize((120, 120), Image.ANTIALIAS)
Labe(image=photo1).grid(row=0, column=7, columnspan=3, rowspan=2, padx=5, pady=5)
ipx1=np.array(image1)
(w,h)=ipx1.shape #120x20

现在我用我的图像做一些事情:

img_fft=np.fft.fft2(image1)
img_shift=np.fft.fftshift(image1_fft)
img_plot1=np.log10(1+abs(img_shift))


foto=Image.fromarray((img_plot1*255.999).round().astype(np.uint8),mode='L')
photo=ImageTk.PhotoImage(foto)
Label(image=photo).grid(row=0, column=10, columnspan=4, rowspan=2, padx=5, pady=5)

但不是: 正确的形象

我越来越 :

错误的图像

任何的想法?

4

1 回答 1

2

当您将内容转换回uint8s 时,您遇到了溢出问题。

您正在使用 进行转换(img_plot1*255.999).round().astype(np.uint8),但是对于接近或等于 1 的值,这将溢出。(大于 0.998 的任何值)

假设img_plot1将始终包含 0 到 1 之间的值,我认为您的意思是:

(img_plot1 * 255.99).astype(np.uint8)

或者

(img_plot1 * 255).round().astype(np.uint8) 

round调用将向上或向下舍入,而纯 int 强制转换实际上是一个floor调用。

但是,仅从输出图像中的“条带”猜测,您的输入数据就会多次溢出和“包装”。因此,您的输入数据的范围可能大于 0-1。

因此,如果您不想担心 中值的确切范围img_plot1,您可以根据其范围将其重新调整为 0-255:

rescaled = 255 * (img_plot1 - img_plot1.min()) / img_plot1.ptp()
foto = Image.fromarray(rescaled.astype(np.uint8), mode='L')

您还可以使用np.digitize重新缩放数组,但它的可读性较差,imo 还可以查看np.clip是否要裁剪高于和低于阈值(例如 0 和 255)的值。

于 2012-11-17T16:47:49.870 回答