data transform-4by4(255).py
9.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
"""
# Fourier Transform(푸리에 변환)
. 시간 도메인(X축)에서 표현된 신호(일반적인 파형 도표)를 주파수 도메인으로 변환.
. 시간축이 제거되어 대상의 전체적인 특징을 파악할 수 있음.
. 이미지에 적용이 되어 중심이 저주파 영역, 주변이 고주파 영역을 나타냄.
. 푸리에 변환을 하여 저주파 또는 고주파를 제거하고 다시 역으로 이미지로 변환 함으로써
이미지가공을 할 수 있음.
(ex; 푸리에 변환 후 중심의 저주파를 제거하고 다시 Image로 전환 하면 이미지의 경계선만 남게 됨.
푸리에 변환 후 주변의 고주파를 제거하면 모아레 패턴(휴대폰으로 모니터를 찍었을 때 나타나는 현상)
을 제거할 수 있음.(모니터의 고주파를 제거함.)
)
"""
from PIL import ImageFilter
from PIL import ImageEnhance
import PIL.Image as im
import cv2
import numpy as np
from matplotlib import pyplot as plt
from glob import glob
import os
test_dirList = glob('.\\CIFAR-10-origin-khu\\test\\*')
train_dirList = glob('.\\CIFAR-10-origin-khu\\train\\*')
valid_dirList = glob('.\\CIFAR-10-origin-khu\\valid\\*')
SAVEPATH = '.\\CIFAR10-PILimageEnhance-sharpness(5)+2by2(middlewhite)'
os.makedirs(SAVEPATH, exist_ok=True)
k = 255 # fft한 후 가운데 픽셀 바꿀 값
l = 2
for i in train_dirList:
print(i)
# filelist에는 "사진 파일들의 리스트"
# glob는 괄호 안 (어떤 path(폴더,파일 다 가능)명 조건) 에 맞는 "path명의 리스트" 뽑을때
filelist = glob(i+'\\*')
# i는 '.\khu-machine-learning-competition\train\airplane'이므로 os.path.spilt(i) 결과는 ('.\khu-machine-learning-competition\train','airplane') 튜플
before_last_path, last = os.path.split(i)
before2_last_path, before_last = os.path.split(before_last_path)
# 해보니까 new_dir = os.path.join(before_last, last) 이건 new_dir = before_last+'\\'+ last 와 동일함...
new_dir = os.path.join(before_last, last)
new_dir = os.path.join(SAVEPATH, new_dir)
print(new_dir)
os.makedirs(new_dir, exist_ok=True)
for j in filelist:
img = im.open(j)
new_file = new_dir+'\\'+os.path.basename(j)
img.save(new_file)
path_without_extension, extension = os.path.splitext(new_file)
new_file2 = path_without_extension + '(1)' + extension
img = cv2.imread(j, 1)
b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow, ccol = rows//2, cols//2
d = l
fshift[crow-d:crow+d, ccol-d:ccol+d] = k
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
cv2.imwrite(new_file2, img_back)
for i in valid_dirList:
print(i)
# filelist에는 "사진 파일들의 리스트"
# glob는 괄호 안 (어떤 path(폴더,파일 다 가능)명 조건) 에 맞는 "path명의 리스트" 뽑을때
filelist = glob(i+'\\*')
# i는 '.\khu-machine-learning-competition\train\airplane'이므로 os.path.spilt(i) 결과는 ('.\khu-machine-learning-competition\train','airplane') 튜플
before_last_path, last = os.path.split(i)
before2_last_path, before_last = os.path.split(before_last_path)
# 해보니까 new_dir = os.path.join(before_last, last) 이건 new_dir = before_last+'\\'+ last 와 동일함...
new_dir = os.path.join(before_last, last)
new_dir = os.path.join(SAVEPATH, new_dir)
print(new_dir)
os.makedirs(new_dir, exist_ok=True)
for j in filelist:
img = im.open(j)
new_file = new_dir+'\\'+os.path.basename(j)
img.save(new_file)
for i in test_dirList:
print(i)
# filelist에는 "사진 파일들의 리스트"
# glob는 괄호 안 (어떤 path(폴더,파일 다 가능)명 조건) 에 맞는 "path명의 리스트" 뽑을때
filelist = glob(i+'\\*')
# i는 '.\khu-machine-learning-competition\train\airplane'이므로 os.path.spilt(i) 결과는 ('.\khu-machine-learning-competition\train','airplane') 튜플
before_last_path, last = os.path.split(i)
before2_last_path, before_last = os.path.split(before_last_path)
# 해보니까 new_dir = os.path.join(before_last, last) 이건 new_dir = before_last+'\\'+ last 와 동일함...
new_dir = os.path.join(before_last, last)
new_dir = os.path.join(SAVEPATH, new_dir)
print(new_dir)
os.makedirs(new_dir, exist_ok=True)
for j in filelist:
img = im.open(j)
new_file = new_dir+'\\'+os.path.basename(j)
img.save(new_file)
def printMatrix(a):
m = len(a)
n = len(a[0])
for i in range(m):
for j in range(n):
print('{:6.2f}'.format(a[i][j]), end=' ')
print()
print()
# OpenCV에서 한글 파일이나 경로명이 들어간 경우 imread와 imwrite가 동작하지 않는다... ㅠ
# colab에서는 openCV의 imshow 돌아가지 않는다.
# 두번째 파라미터 1 의미는 cv2.IMREAD_COLOR cf) cv2.IMREAD_COLOR : 1, cv2.IMREAD_GRAYSCALE : 0, cv2.IMREAD_UNCHANGED : -1
# img = cv2.imread('cifar10-train-29.png', 1)
# image_pil = im.open('n04461696_3346.png')
# # image_pil.show()
# img1 = np.array(image_pil)
# print(img1.shape)
img = cv2.imread('cifar10-train-29.png', 1)
b, g, r = cv2.split(img) # 이미지를 b,g,r 채널로 분리 (opencv에서는 bgr순서)
img0 = cv2.merge([r, g, b]) # r,g,b 순서로 병합
print(img0.shape)
# plt.subplot(211), plt.imshow(img0)
# plt.title('Input Image_cv2'), plt.xticks([]), plt.yticks([])
# plt.subplot(212), plt.imshow(image_pil)
# plt.title('Input Image_PIL'), plt.xticks([]), plt.yticks([])
# plt.show()
img1 = np.array([img0[:, :, 0], img0[:, :, 1], img0[:, :, 2]])
img2 = img1
i = 0
# img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # color->gray로 변환
# Fourier Transform을 적용.
# 적용을 하면 0, 0, 즉 화면 좌측상단점이 중심이고, 거기에 저주파가 모여 있음.
# 분석을 용이하게 하기 위해 0, 0을 이미지의 중심으로 이동 시키고 Log Scaling을 하여 분석이 용이한 결과값으로 변환
for img in img1:
f = np.fft.fft2(img) # 이미지에 푸리에 변환 적용
# 분석을 용이하게 하기 위해 주파수가 0인 부분을 중앙에 위치시킴. 중앙에 저주파가 모이게 됨.
magnitude_spectrum_no_shift = 20*np.log(np.abs(f))
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift)) # spectrum 구하는 수학식.
print(img.shape, fshift.shape)
rows, cols = img.shape
crow, ccol = rows//2, cols//2 # 이미지의 중심 좌표
# 중앙에서 10X10 사이즈의 사각형의 값을 1로 설정함. 중앙의 저주파를 모두 제거
# 저주파를 제거하였기 때문에 배경이 사라지고 경계선만 남게 됨.
d = 1
fshift[crow-d:crow+d, ccol-d:ccol+d] = 1
aft_magnitude_spectrum = 20*np.log(np.abs(fshift))
# 푸리에 변환결과를 다시 이미지로 변환
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
img2[i] = img_back
i += 1
# threshold를 적용하기 위해 float type을 int type으로 변환
img_new = np.uint8(img_back)
ret, thresh = cv2.threshold(img_new, 20, 255, cv2.THRESH_BINARY)
# plt.subplot(231), plt.imshow(img)
# plt.title('Input Image'), plt.xticks([]), plt.yticks([])
# plt.subplot(232), plt.imshow(magnitude_spectrum_no_shift)
# plt.title('noShift_Spectrum'), plt.xticks([]), plt.yticks([])
# plt.subplot(233), plt.imshow(magnitude_spectrum)
# plt.title('Spectrum'), plt.xticks([]), plt.yticks([])
# plt.subplot(234), plt.imshow(aft_magnitude_spectrum)
# plt.title('aft_Spectrum'), plt.xticks([]), plt.yticks([])
# plt.subplot(236), plt.imshow(thresh)
# plt.title('Threshold With FT'), plt.xticks([]), plt.yticks([])
# plt.show()
img2 = np.transpose(img2, (1, 2, 0))
printMatrix(img2[:, :, 0])
printMatrix(img2[:, :, 1])
printMatrix(img2[:, :, 2])
plt.subplot(231), plt.imshow(img0)
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(magnitude_spectrum_no_shift)
plt.title('noShift_Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(magnitude_spectrum)
plt.title('Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(aft_magnitude_spectrum)
plt.title('aft_Spectrum'), plt.xticks([]), plt.yticks([])
print(img2.shape)
plt.subplot(235), plt.imshow(img2)
plt.title('FT'), plt.xticks([]), plt.yticks([])
# plt.subplot(236), plt.imshow(im.fromarray(
# img0).filter(ImageFilter.FIND_EDGES))
# plt.title('ImageFilter.CONTOUR'), plt.xticks([]), plt.yticks([])
plt.show()
# im.fromarray(img2).save("cifar10-train-16513 (2)-1.png")
print(cv2.__version__)