回答編集履歴

1

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

2017/08/18 22:25

投稿

退会済みユーザー
test CHANGED
@@ -13,3 +13,143 @@
13
13
  '---
14
14
 
15
15
  FFT/畳み込みを使ってる感がいろいろ楽しそうで、質問の方法の解を見てみたい気もします。
16
+
17
+
18
+
19
+ 2017-08-19 追記
20
+
21
+ `python blurer.py fft_of_original.png`で同じ画像が再現できます。
22
+
23
+ まだ修正中ですが…
24
+
25
+
26
+
27
+ ```Python
28
+
29
+ import sys
30
+
31
+ import numpy as np
32
+
33
+ from PIL import Image
34
+
35
+ # from scipy import signal
36
+
37
+
38
+
39
+ # Comment out
40
+
41
+ # if len(sys.argv) != 5:
42
+
43
+ # print('python blurer.py input fft_of_blur fft_of_original result')
44
+
45
+
46
+
47
+ if len(sys.argv) != 2:
48
+
49
+ print('python blurer.py fft_of_original.png')
50
+
51
+ sys.exit(1)
52
+
53
+
54
+
55
+ # ブレを表現する画像をつくる
56
+
57
+ size = 128
58
+
59
+ half_size = int((size - 1) / 2)
60
+
61
+ blur = Image.new('L', (size, size))
62
+
63
+ blur_pixels = blur.load()
64
+
65
+
66
+
67
+ for x in range(half_size, half_size + 5):
68
+
69
+ for y in range(half_size, half_size + 20):
70
+
71
+ blur_pixels[half_size, y] = 255
72
+
73
+
74
+
75
+ blur.save('blur.png')
76
+
77
+
78
+
79
+ # FFTと畳み込み
80
+
81
+
82
+
83
+ # ブレ画像
84
+
85
+ blur_arr = np.array(blur)
86
+
87
+ Z = np.fft.fft2(blur_arr)
88
+
89
+ Z = np.fft.fftshift(Z)
90
+
91
+ P = np.log(np.abs(Z) + 1)
92
+
93
+ P_norm = (P * 255.0) / np.amax(P)
94
+
95
+ y = np.uint8(np.around(P_norm))
96
+
97
+ print("BLUR MIN:%s"%np.min(y))
98
+
99
+ print("BLUR MAX:%s"%np.max(y))
100
+
101
+ img_out = Image.fromarray(y)
102
+
103
+ img_out.save("blur_arr.png")
104
+
105
+
106
+
107
+ # 原画像
108
+
109
+ img_in = Image.open(sys.argv[1])
110
+
111
+ x = np.array(img_in.convert('L'))
112
+
113
+ X = np.fft.fft2(x)
114
+
115
+ X = np.fft.fftshift(X)
116
+
117
+ P = np.log(np.abs(X) + 1)
118
+
119
+ P_norm = (P * 255.0) / np.amax(P)
120
+
121
+ y = np.uint8(np.around(P_norm))
122
+
123
+ print("ORIGINAL MIN:%s"%np.min(y))
124
+
125
+ print("ORIGINAL MAX:%s"%np.max(y))
126
+
127
+ img_out = Image.fromarray(y)
128
+
129
+ img_out.save("fftshift.png")
130
+
131
+
132
+
133
+ # 畳み込み結果
134
+
135
+ W = np.fft.fftshift(np.fft.ifft2(Z * X))
136
+
137
+ P = np.log(np.abs(W) + 1)
138
+
139
+ P_norm = P / np.amax(P) * 255
140
+
141
+ y = np.uint8(np.around(P_norm))
142
+
143
+ print("CONV MIN:%s"%np.min(y))
144
+
145
+ print("CONV MAX:%s"%np.max(y))
146
+
147
+ img_out = Image.fromarray(y)
148
+
149
+ img_out.save("conv.png")
150
+
151
+
152
+
153
+ ```
154
+
155
+