###前提・実現したいこと
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/06/13 21:43