前提・実現したいこと
ブレ画像の点拡がり関数をpythonで求めたい。
ケプストラムは画像の対数振幅スペクトルを逆フーリエ変換したものである。という所までは理解した。
画像→2次元フーリエ変換→log→逆2次元フーリエ変換→ケプストラム出力 の順番だと認識している。
発生している問題・エラーメッセージ
出力されるケプストラムの画像は真っ暗である
該当のソースコード
rekka_imgは自分で作成した劣化した画像
python
1kepusutoramu = np.fft.fft2(rekka_img) 2kepusutoramu = np.fft.fftshift(kepusutoramu) 3kepusutoramu = np.log(np.abs(kepusutoramu)) +1 4kepusutoramu = np.fft.ifftshift(kepusutoramu) 5kepusutoramu = np.fft.ifft2(kepusutoramu).real 6print(kepusutoramu) 7plt.subplot(141),plt.imshow(rekka_img, cmap = 'gray') 8plt.title('Input image'), plt.xticks([]), plt.yticks([]) 9plt.subplot(142),plt.imshow(kepusutoramu, cmap = 'gray') 10plt.title('Input image'), plt.xticks([]), plt.yticks([]) 11cv2.imwrite('/content/drive/My Drive/ケプストラム.jpg', kepusutoramu) 12plt.show()
質問
そもそも手順や認識が合っているのか分からず手詰まりの状態であり、どこが間違っているか分からない状態なので指摘して頂ければ幸いです。
logの底の値は何なのでしょうか
補足情報(FW/ツールのバージョンなど)
もしかしたら劣化画像を作成した段階で間違えている可能性があるので、全プログラムを以下に出します。
#import from google.colab import drive drive.mount('/content/drive') import sys import numpy as np from matplotlib import pyplot as plt from PIL import Image from scipy import signal import cv2 import base64 #PSF作成 height = 512 width = 512 blur = np.zeros((height, width), np.uint8) blur = cv2.line(blur,(240,240),(240,262),(255,255, 255),1) plt.subplot(121),plt.imshow(blur),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show() print(blur.shape) cv2.imwrite('/content/drive/My Drive/blur.jpg', blur) blur = cv2.imread('/content/drive/My Drive/blur.jpg',cv2.IMREAD_GRAYSCALE) plt.subplot(122),plt.imshow(blur),plt.title('A2veraging') plt.xticks([]), plt.yticks([]) print(blur.shape) #PSFをfft f = np.fft.fft2(blur)#blurは表示するために使う blur_fshift = np.fft.fftshift(f) magnitude_spectrum1 = 20*np.log(np.abs(blur_fshift)) print(magnitude_spectrum1) blur_fshift = np.fft.fftshift(blur_fshift) plt.subplot(121),plt.imshow(blur, cmap = 'gray') plt.title('Input Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(magnitude_spectrum1, cmap = 'gray') plt.title('blur Spectrum'), plt.xticks([]), plt.yticks([]) plt.show() print(magnitude_spectrum1) #lenaのfft imput_img = cv2.imread('/content/drive/My Drive/lena.jpg',cv2.IMREAD_GRAYSCALE) print(imput_img.shape) imput_fshift = np.fft.fft2(imput_img)#img imput_fshift = np.fft.fftshift(imput_fshift) magnitude_spectrum2 = 20*np.log(np.abs(imput_fshift)) + 1 print(magnitude_spectrum2) imput_fshift = np.fft.ifftshift(imput_fshift) plt.subplot(121),plt.imshow(imput_img, cmap = 'gray') plt.title('Input image'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(magnitude_spectrum2, cmap = 'gray') plt.title('imput spectrum'), plt.xticks([]), plt.yticks([]) plt.show() cv2.imwrite('/content/drive/My Drive/fftshift.jpg',magnitude_spectrum2 ) # 劣化画像のifft rekka_img = np.fft.ifft2(imput_fshift*blur_fshift).real rekka_img = np.fft.ifftshift(rekka_img) # 可視化 plt.subplot(131),plt.imshow(imput_img, cmap = 'gray') plt.title('Input image'), plt.xticks([]), plt.yticks([]) plt.subplot(132),plt.imshow(magnitude_spectrum2, cmap = 'gray') plt.title('imput spectrum'), plt.xticks([]), plt.yticks([]) plt.subplot(133),plt.imshow(rekka_img, cmap = 'gray') plt.title('rekka iamge'), plt.xticks([]), plt.yticks([]) plt.show() #print(i_f_xy) cv2.imwrite('/content/drive/My Drive/劣化lena.jpg', rekka_img) print(rekka_img.shape) #劣化画像のケプストラム作成 kepusutoramu = np.fft.fft2(rekka_img) kepusutoramu = np.fft.fftshift(kepusutoramu) kepusutoramu = np.log(np.abs(kepusutoramu)) +1 kepusutoramu = np.fft.ifftshift(kepusutoramu) kepusutoramu = np.fft.ifft2(kepusutoramu).real print(kepusutoramu) plt.subplot(141),plt.imshow(rekka_img, cmap = 'gray') plt.title('Input image'), plt.xticks([]), plt.yticks([]) plt.subplot(142),plt.imshow(kepusutoramu, cmap = 'gray') plt.title('Input image'), plt.xticks([]), plt.yticks([]) cv2.imwrite('/content/drive/My Drive/ケプストラム.jpg',kepusutoramu ) plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。