data transform-PILimagefilter(sharpen).py 9.19 KB
"""
# 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 = 1  # fft한 후 가운데 픽셀 바꿀 값
l = 1
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.filter(ImageFilter.SHARPEN).save(new_file2)
        # 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)

        # new_file3 = path_without_extension + '(2)' + extension
        # cv2.imwrite(new_file3, 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__)