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

uint8物事をs にキャストし直すときに、オーバーフローの問題が発生しています。

で変換しています(img_plot1*255.999).round().astype(np.uint8)が、これは 1 に近い値または 1 の値でオーバーフローします (0.998 より大きいもの)。

常に0と1の間の値が含まれると仮定するimg_plot1と、次のいずれかを行うつもりだったと思います:

(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、読みにくくなってしまいnp.clipます。しきい値 (0 と 255 など) の上下の値をクリップする場合も参照してください。

于 2012-11-17T16:47:49.870 に答える