課題名
画像のFFTによる周波数のαブレンディング、二つの画像の特定周波数範囲の合成
研究者名
Yokota Raimu
概要
グレースケールにした二つの画像に対し、高速フーリエ変換(FFT)を行い、画像の周波数成分をαブレンディングして逆離散フーリエ変換により画像を生成した。
今回、例として二つの画像の周波数成分の割合を9対1,66対34,1対1,33対64,1対9で行った。
また、二つの画像の周波数成分の異なる範囲を組み合わせて画像を生成してみた。
周波数成分における中心にから特定半径の円とその他の範囲の合成を行った。
半径は画像の高さの半分の0.90,1.10,1.30,1.35,1.38,1.40,1.41倍したものとした。
ソースコードと実行結果
FFT_alpha.py
import numpy as np
import scipy.misc
import matplotlib.pyplot as plt
from PIL import Image
import warnings
warnings.filterwarnings('ignore') # 警告無視、無くても良い
im = np.array(Image.open('lena.jpg'))
plt.figure(dpi=200) # 解像度指定、無いと表示が小さい
plt.subplot(121)
plt.imshow(im)
im_gray = np.array(Image.open('lena.jpg').convert('L')) # 8bitグレースケール化
plt.subplot(122)
plt.imshow(im_gray, cmap = 'gray')
plt.show()
im_a = np.array(Image.open('a.jpg'))
plt.figure(dpi=200) # 解像度指定、無いと表示が小さい
plt.subplot(121)
plt.imshow(im_a)
im_a_gray = np.array(Image.open('a.jpg').convert('L')) # 8bitグレースケール化
plt.subplot(122)
plt.imshow(im_a_gray, cmap = 'gray')
plt.show()
im_F = np.fft.fft2(im_gray) # FFT
plt.figure(dpi=200)
plt.subplot(121)
plt.imshow(np.log(np.abs(im_F)), cmap='jet')
# FFTしたものをそのままIFFT(虚数部が残るので実数部分のみを取り出す)
im_I = np.fft.ifft2(im_F).real
plt.subplot(122)
plt.imshow(im_I, cmap = 'gray')
plt.show()
im_a_F = np.fft.fft2(im_a_gray) # FFT
plt.figure(dpi=200)
plt.subplot(121)
plt.imshow(np.log(np.abs(im_a_F)), cmap='jet')
# FFTしたものをそのままIFFT(虚数部が残るので実数部分のみを取り出す)
im_a_I = np.fft.ifft2(im_a_F).real
plt.subplot(122)
plt.imshow(im_a_I, cmap = 'gray')
plt.show()
#アルファブレンディングと逆FFT
origiN = np.array([1.0])
alphA = np.array([0.90,0.66,0.50,0.33,0.10])
for i in range(len(alphA)):
im_alphA_F = im_F*alphA[i] + im_a_F*(origiN-alphA[i])
plt.figure(dpi=200)
plt.subplot(121)
plt.imshow(np.log(np.abs(im_alphA_F)), cmap = 'jet')
#IFFT
im_alphA_I = np.fft.ifft2(im_alphA_F).real
plt.subplot(122)
plt.imshow(im_alphA_I, cmap = 'gray')
plt.show()
FFT_composition.py
import numpy as np
import scipy.misc
import matplotlib.pyplot as plt
from PIL import Image
import warnings
warnings.filterwarnings('ignore') # 警告無視、無くても良い
im = np.array(Image.open('lena.jpg'))
plt.figure(dpi=200) # 解像度指定、無いと表示が小さい
plt.subplot(121)
plt.imshow(im)
im_gray = np.array(Image.open('lena.jpg').convert('L')) # 8bitグレースケール化
plt.subplot(122)
plt.imshow(im_gray, cmap = 'gray')
plt.show()
im_a = np.array(Image.open('a.jpg'))
plt.figure(dpi=200) # 解像度指定、無いと表示が小さい
plt.subplot(121)
plt.imshow(im_a)
im_a_gray = np.array(Image.open('a.jpg').convert('L')) # 8bitグレースケール化
plt.subplot(122)
plt.imshow(im_a_gray, cmap = 'gray')
plt.show()
im_F = np.fft.fft2(im_gray) # FFT
plt.figure(dpi=200)
plt.subplot(121)
plt.imshow(np.log(np.abs(im_F)), cmap='jet')
# FFTしたものをそのままIFFT(虚数部が残るので実数部分のみを取り出す)
im_I = np.fft.ifft2(im_F).real
plt.subplot(122)
plt.imshow(im_I, cmap = 'gray')
plt.show()
im_a_F = np.fft.fft2(im_a_gray) # FFT
plt.figure(dpi=200)
plt.subplot(121)
plt.imshow(np.log(np.abs(im_a_F)), cmap='jet')
# FFTしたものをそのままIFFT(虚数部が残るので実数部分のみを取り出す)
im_a_I = np.fft.ifft2(im_a_F).real
plt.subplot(122)
plt.imshow(im_a_I, cmap = 'gray')
plt.show()
#画像の合成
alphA = np.array([0.90,1.10,1.30,1.35,1.38,1.40,1.41])
for n in range(len(alphA)):
alpha_filter_L = np.zeros(im_gray.shape)
alpha_filter_H = np.zeros(im_gray.shape)
center = len(alpha_filter_L)/2
for i in range(len(alpha_filter_L)):
for j in range(len(alpha_filter_L[0])):
if (center-i)**2 + (center-j)**2 > (center*alphA[n])**2:
alpha_filter_L[i][j] = 1
else:
alpha_filter_H[i][j] = 1
im_alphA_F = im_F*alpha_filter_L + im_a_F*alpha_filter_H
plt.figure(dpi=200)
plt.subplot(121)
plt.imshow(np.log(np.abs(im_alphA_F)), cmap = 'jet')
#IFFT
im_alphA_I = np.fft.ifft2(im_alphA_F).real
plt.subplot(122)
plt.imshow(im_alphA_I, cmap = 'gray')
plt.show()
考察
周波数成分によるαブレンディングは通常のαブレンディングに似た効果を確認できた。
そこで、周波数成分の範囲によって合成を行ったところ、二つの画像の低い周波数部分を含んでいる範囲が画像の高さの1.35倍のとき、二つの画像の特徴がαブレンディングとは違った形で存在する画像の合成をすることができた。驚くことに範囲の円の半径が画像の高さ1.4倍の場合と1.41倍の場合の合成画像は明確に明暗が少し異なる画像となった。範囲の円が小さいときに合成画像は一つ目の画像とほぼ同様であったことから低周波数部分の画像の影響力の大きさがわかる。
今回、合成した範囲が中心からの円の内側と外側で行ったが異なる範囲で行うことで両方の特徴を持つ画像を上手く合成できるかもしれない。
また、画像のサイズが違くても画像の範囲を指定して合成した画像の低い周波成分をその範囲にちりばめると綺麗に二つの画像が残ったものを得られるかもしれない。
一応、条件を変えたソースコードも作成していたが上手く実行できなかったので今後改変を加えて実行していきたい。