前提
pythonでfft変換した画像をopencvのimwriteで保存しようとすると真っ黒な画像が保存されてしまいます。imshowでは正しい画像が表示されています。
実現したいこと
正しい画像を保存する。
該当のソースコード
python
1import numpy as np 2import matplotlib.pyplot as plt 3import cv2 4 5img = cv2.imread("/content/Tree.jpeg") 6X=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 7X=np.fft.fft2(X) 8X=np.fft.fftshift(X) 9X=np.abs(X) 10X=np.log(X.real+1) 11#X=X.astype(np.uint8) 12 13plt.imshow(X, cmap='gray', interpolation='none') 14plt.show() 15 16print('Type', type(X)) 17print('data type: ', X.dtype) 18 19cv2.imwrite("fft.jpeg",X)
試したこと
https://teratail.com/questions/204059
ここでの回答にあるように、unit8の変換も試しましたが駄目でした。
「plt.imshow」では、画像の一番暗いところを黒で、一番明るいところを白で表示するように、自動的に明るさが調整されますが、「cv2.imwrite」では明るさが調整されないので、
> opencvのimwriteで保存しようとすると真っ黒な画像が保存されてしまいます。
となります
> imshowでは正しい画像が表示されています。
逆です
明るさが調整されない「cv2.imwrite」の方が、本当は正しいのです
数値が小さすぎると、全部黒にしか見えませんが、本当は微妙に明るさが変わってて、その値はfftの結果通りなのです
plt.imshow(X, cmap='gray', interpolation='none')
↓ 変更
plt.imshow(X, cmap='gray', interpolation='none', vmin=0, vmax=255)
としたら、「plt.imshow」でも明るさの調整がされなくなるので、
> opencvのimwriteで保存しようとすると真っ黒な画像が保存されてしまいます。
と同様になります
cv2.imwrite("fft.jpeg",X)
↓ 変更
Xn = (X - X.min()) / (X.max() - X.min()) * 255
cv2.imwrite("fft.jpeg",Xn)
としたら、「plt.imshow」と同様に明るさ調整がされたデータ「Xn」が「cv2.imwrite」で保存されます

回答1件
あなたの回答
tips
プレビュー