teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

質問と同じ画像の再現方法の追記

2017/08/18 22:25

投稿

退会済みユーザー
answer CHANGED
@@ -5,4 +5,73 @@
5
5
  ブレ方向を質問と同様にする場合には、`kernel_motion_blur[ : , int((size-1)/2)] = np.ones(size)`にしたらいけますね。
6
6
 
7
7
  '---
8
- FFT/畳み込みを使ってる感がいろいろ楽しそうで、質問の方法の解を見てみたい気もします。
8
+ FFT/畳み込みを使ってる感がいろいろ楽しそうで、質問の方法の解を見てみたい気もします。
9
+
10
+ 2017-08-19 追記
11
+ `python blurer.py fft_of_original.png`で同じ画像が再現できます。
12
+ まだ修正中ですが…
13
+
14
+ ```Python
15
+ import sys
16
+ import numpy as np
17
+ from PIL import Image
18
+ # from scipy import signal
19
+
20
+ # Comment out
21
+ # if len(sys.argv) != 5:
22
+ # print('python blurer.py input fft_of_blur fft_of_original result')
23
+
24
+ if len(sys.argv) != 2:
25
+ print('python blurer.py fft_of_original.png')
26
+ sys.exit(1)
27
+
28
+ # ブレを表現する画像をつくる
29
+ size = 128
30
+ half_size = int((size - 1) / 2)
31
+ blur = Image.new('L', (size, size))
32
+ blur_pixels = blur.load()
33
+
34
+ for x in range(half_size, half_size + 5):
35
+ for y in range(half_size, half_size + 20):
36
+ blur_pixels[half_size, y] = 255
37
+
38
+ blur.save('blur.png')
39
+
40
+ # FFTと畳み込み
41
+
42
+ # ブレ画像
43
+ blur_arr = np.array(blur)
44
+ Z = np.fft.fft2(blur_arr)
45
+ Z = np.fft.fftshift(Z)
46
+ P = np.log(np.abs(Z) + 1)
47
+ P_norm = (P * 255.0) / np.amax(P)
48
+ y = np.uint8(np.around(P_norm))
49
+ print("BLUR MIN:%s"%np.min(y))
50
+ print("BLUR MAX:%s"%np.max(y))
51
+ img_out = Image.fromarray(y)
52
+ img_out.save("blur_arr.png")
53
+
54
+ # 原画像
55
+ img_in = Image.open(sys.argv[1])
56
+ x = np.array(img_in.convert('L'))
57
+ X = np.fft.fft2(x)
58
+ X = np.fft.fftshift(X)
59
+ P = np.log(np.abs(X) + 1)
60
+ P_norm = (P * 255.0) / np.amax(P)
61
+ y = np.uint8(np.around(P_norm))
62
+ print("ORIGINAL MIN:%s"%np.min(y))
63
+ print("ORIGINAL MAX:%s"%np.max(y))
64
+ img_out = Image.fromarray(y)
65
+ img_out.save("fftshift.png")
66
+
67
+ # 畳み込み結果
68
+ W = np.fft.fftshift(np.fft.ifft2(Z * X))
69
+ P = np.log(np.abs(W) + 1)
70
+ P_norm = P / np.amax(P) * 255
71
+ y = np.uint8(np.around(P_norm))
72
+ print("CONV MIN:%s"%np.min(y))
73
+ print("CONV MAX:%s"%np.max(y))
74
+ img_out = Image.fromarray(y)
75
+ img_out.save("conv.png")
76
+
77
+ ```