質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7205閲覧

フーリエ変換・逆フーリエ変換後に値が振り切って画像に戻せません

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/06/11 07:38

編集2017/06/12 22:38

###前提・実現したいこと
Python+OpenCVで、カラー画像にフーリエ変換を行ってマスク処理をしたいと考えています。昨日からこちらの説明(鳥取大)を参考に、とりあえず動くところまでこぎつけました。

動かし方: D:>python fftmask.py 画像のファイル名

###発生している問題・エラーメッセージ
FFT-->IFFTで画像が元に戻ることを確認するために、FFTとIFFT処理だけを実装してテストしましたが、以下のように画像が元に戻らない(ほぼ二値化し、色合いも異常になる)状態です。

生画像加工後画像
生画像処理後

(6/12 A.M 追記: pltを使って中身を確認しました)
・二値化?
IFFT後のプロット画像を見ると値に"*e^+7"がくっついており、このせいで画像がほぼ二値化してしまっているようです
・色合いが異常
上記の二値化の影響で緑だけが突出してしまっているようです

(6/12 P.M 追記: stackoverflowで似た様な事例を発見しました)
・IDFT(IFFT)の結果が255を振り切っている件
stackoverflow

(6/13 A.M 追記1: stackoverflowの事例を参考にe^6~7を外すところまで来ました)
・255を振り切っている部分を0~255までに収めることができました
・ただし、string,plt上では元の値に戻せていますが、openCV上では真っ暗になります

(6/13 A.M 追記2)
・intが64ではだめですよね

###該当のソースコード

Python

1# -*- coding: utf-8 -*- 2print ("* Now initializing... import") 3import sys 4import os 5import cv2 6import numpy as np 7from matplotlib import pyplot as plt 8 9# Global variables 10current_working_directory = os.getcwd() 11args = sys.argv 12 13# -------------------------------------- 14def DFT_IDFT_core(img_ch): 15 # ------------------------ 16 # DFT method with OpenCV 17 # ------------------------ 18 # Get image size 19 row,col = img_ch.shape 20 row_center, col_center = int(row/2), int(col/2) 21 22 # Calclate optimized size for FFT 23 fft_row = cv2.getOptimalDFTSize(row) 24 fft_col = cv2.getOptimalDFTSize(col) 25 26 # Generate optimized image 27 img_merged = np.zeros((fft_row, fft_col), np.uint8) 28 img_merged[0:row,0:col] = img_ch 29 30 # Calc DFT(IMPORTANT: CALL "cv2.DFT_SCALE" TO REMOVE "*e^x") 31 dft = cv2.dft(np.float32(img_merged),flags=cv2.DFT_COMPLEX_OUTPUT|cv2.DFT_SCALE ) 32 33 # Shift DFT 34 dft_shift = np.fft.fftshift(dft) 35 36 # MASK process 37 # mask = np.zeros((fft_row,fft_col,2),np.uint8) 38 # mask[row_center-200:row_center+200, col_center-200:col_center+200] = 1 39 # masked = dft_shift*mask 40 masked = dft_shift 41 42 # Calc IDFT 43 f_ishift = np.fft.ifftshift(masked) 44 img_back = cv2.idft(f_ishift) 45 46 # Calc magnitude 47 img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) 48 49 # Crop raw area 50 img_back = img_back[0:row, 0:col] 51 52 # Float to ingeter 53 img_back = np.round(img_back).astype(np.int64) 54 55 # Debug with string 56 print("INPUT: %s\n"%(img_ch)) 57 print("OUTPUT: %s\n\n"%(img_back)) 58 59 # Debug 60 plt.subplot(121),plt.imshow(img_ch, cmap = 'gray') 61 plt.title('Input Image'), plt.xticks([]), plt.yticks([]) 62 plt.subplot(122),plt.imshow(img_back, cmap = 'gray') 63 plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) 64 plt.show() 65 66 # Debug with openCV 67 cv2.imshow("img_ch",img_ch) 68 cv2.imshow("img_back",img_back) 69 cv2.waitKey(0) 70 71 return img_back 72 73# -------------------------------------- 74def MASK_PROCESS_BY_FFT(img_col): 75 76 # Split image by color channels 77 if len(img_col.shape)== 3: 78 channels = 3 79 img_b, img_g, img_r = cv2.split(img_col) 80 # cv2.imshow("img_b",img_b) 81 # cv2.imshow("img_g",img_g) 82 # cv2.imshow("img_r",img_r) 83 else: 84 # Grayscale 85 channels = 1 86 img_gs = img_col 87 # cv2.imshow("img_grayscale",img_grayscale) 88 89 # FFT process 90 if channels == 3: 91 # Combine BGR 92 img_b_fft = DFT_IDFT_core(img_b) 93 img_g_fft = DFT_IDFT_core(img_g) 94 img_r_fft = DFT_IDFT_core(img_r) 95 # cv2.imshow("img_b_fft",img_b_fft) 96 # cv2.imshow("img_g_fft",img_g_fft) 97 # cv2.imshow("img_r_fft",img_r_fft) 98 99 img_merge = np.dstack((img_b_fft, img_g_fft, img_r_fft)) 100 # cv2.imshow("img_merge",img_merge) 101 # cv2.imwrite("img_merge.jpg",img_merge) 102 103 return img_merge 104 else: 105 img_g_fft = FFT_IFFT_FFT_core(img_gs) 106 # cv2.imshow("img_gs_fft",img_gs_fft) 107 # cv2.imwrite("img_merge.jpg",img_g_fft) 108 109 return img_g_fft 110 111# Main 112if __name__ == '__main__': 113 # Just one argument 114 if len(sys.argv) == 2: 115 116 picture_file = args[1] 117 img_col = cv2.imread(picture_file , cv2.IMREAD_COLOR) 118 119 # Failed to load an image 120 if img_col is None: 121 print("** ----------------------------------------------------------------------------------------------") 122 print("** Failed to load image file, invalid file. It may not image file or, may contain 2 byte letters, or run python on wrong directory.") 123 print("** See below to refer argument.") 124 print("** Image file: %s"%(args[1])) 125 print("** ----------------------------------------------------------------------------------------------") 126 sys.exit() 127 128 129 cv2.imshow("MASKED",MASK_PROCESS_BY_FFT(img_col)) 130 131 cv2.waitKey(0) 132 133 # Failed to call argument 134 else: 135 print ("* Invalid command line syntax.") 136 print (" To evaluate image file -----> Usage: python %s %s" %(args[0], "[Picture file]")) 137 sys.exit() 138

###試したこと
カラー画像の場合、RGBに分割してそれぞれのチャンネルに対してFTT-->IFFTをしています。それぞれのチャンネルに対してIFFT後のを確認しましたが、IFFT後にほぼ二値化されている(?)ようで、そこに問題があるように感じています。

###補足情報(言語/FW/ツール等のバージョンなど)
Python 3.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

import部分にfrom PIL import Imageを追加した上で、関数を以下のように挿げ替えるとちゃんと動きます。

Python

1 2def DFT_IDFT_core(img_ch): 3 # ------------------------ 4 # DFT method with OpenCV 5 # ------------------------ 6 7 # Get image size 8 row,col = img_ch.shape 9 row_center, col_center = int(row/2), int(col/2) 10 11 # Calclate optimized size for FFT 12 fft_row = cv2.getOptimalDFTSize(row) 13 fft_col = cv2.getOptimalDFTSize(col) 14 15 # Generate optimized image 16 img_merged = np.zeros((fft_row, fft_col), np.uint8) 17 img_merged[0:row,0:col] = img_ch 18 19 # Calc DFT(IMPORTANT: CALL "cv2.DFT_SCALE" TO REMOVE "*e^x") 20 dft = cv2.dft(np.float32(img_merged),flags=cv2.DFT_COMPLEX_OUTPUT|cv2.DFT_SCALE ) 21 22 # Shift DFT 23 dft_shift = np.fft.fftshift(dft) 24 25 # MASK process 26 # mask = np.zeros((fft_row,fft_col,2),np.uint8) 27 # mask[row_center-200:row_center+200, col_center-200:col_center+200] = 1 28 # masked = dft_shift*mask 29 masked = dft_shift 30 31 # Calc IDFT 32 f_ishift = np.fft.ifftshift(masked) 33 img_back = cv2.idft(f_ishift) 34 35 # Calc magnitude 36 img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) 37 38 # Crop raw area 39 img_back = img_back[0:row, 0:col] 40 41 # Float to ingeter 42 #img_back = np.round(img_back).astype(np.int64) 43 img_back = np.uint8(np.round(img_back)) 44 45 # Debug with openCV 46 cv2.imshow("img_ch",img_ch) 47 cv2.imshow("img_back",img_back) 48 cv2.waitKey(0) 49 50 # Debug with plt 51 plt.subplot(121),plt.imshow(img_ch, cmap = 'gray') 52 plt.title('Input Image'), plt.xticks([]), plt.yticks([]) 53 plt.subplot(122),plt.imshow(img_back, cmap = 'gray') 54 plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) 55 plt.show() 56 57 return img_back 58

投稿2017/06/12 22:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/13 21:43

>import部分にfrom PIL import Imageを追加した上で 今更ですが、PILは呼び出していないのでこの部分は不要でした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問