dct_block_test.py 파일을 올바른 명령행 인자 처리로 실행시킬 수 있다.
ap = argparse.ArgumentParser()
ap.add_argument('-i', '--image', required = True, \
help = 'Path to the input image')
args = vars(ap.parse_args())
filename = args['image']
i로 이미지의 경로를 입력받는다. 받아온 값은 filename 변수에 저장한다.
for i in np.r_[:imsize[0]:16]:
for j in np.r_[:imsize[1]:16]:
dct[i:(i+16),j:(j+16)] = cv2.dct( gray2[i:(i+16),j:(j+16)] )
pos = 128
block_size를 설정하고, 반복문을 사용하여 DCT를 수행한다. 실습을 위해 4, 8, 16을 block_size로 지정하고 실행했다.
thresh = 0.001 # 1: 0.379 / 2: 0.17 / 3: 0.024 / 4: 0.001 / 5: 0.0003
dct_thresh = dct * (abs(dct) > (thresh*np.max(dct)))
threshold 값을 설정하고 DCT 영상에 대한 threshold를 수행한다.
1) 원본 DCT와 threshold된 DCT에 대한 비교 (8x8)
2) 원본 영상과 압축된 영상 비교 (8x8)
3) 부분 확대 (8x8)
4) 블록 사이즈 변경 (thresh = 0.001 일 때 기준)
자세한 코드는 Github에서 확인할 수 있다.
image = cv2.imread(filename)
temp = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
Y, U, V = cv2.split(temp)
equalize = cv2.equalizeHist(Y)
hsv = cv2.merge([equalize, U, V])
hsv = cv2.cvtColor(hsv, cv2.COLOR_YUV2BGR)
hsv = cv2.cvtColor(hsv, cv2.COLOR_BGR2RGB)
result, filt, mag = homomorphic_filtering(hsv, \
'high_Gaussian', 0.05, 5, 0.5, 2.0)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
OpenCV를 사용하여 영상 데이터를 로딩한다. 히스토그램 균일화를 수행하기 위해 YUV로 이미지를 변환하고 Y, U, V 성분으로 split 함수를 통해 나눈다. 이 중 Y 성분에 대해 히스토그램 균일화를 진행하고 이를 다시 병합하여 homomorphic_filtering 함수에 입력한다.
def apply_filter(fshift, filt, a, b):
filter = b*filt
if len(fshift.shape) is 2:
n_lp_filt = filter
elif len(fshift.shape) is 3:
n_lp_filt = np.dstack([filter, filter])
n_fshift = n_lp_filt * fshift
return n_fshift
apply_filter 함수이다. 맨 윗줄에 필터에 대해 고주파 가중치를 적용하는 코드를 추가하였다.
def homomorphic_filtering(image, type, cutoff, order, a, b):
if (image.shape[2] == 3):
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ft_shift, mag, s_mag = DFT_Numpy(image)
image_log = np.log1p(abs(image))
size = ft_shift.shape[0:2]
filt = make_filter(size, type, cutoff, order)
ft_filt_shift = apply_filter(ft_shift, filt, a, b)
rows, cols = image_log.shape
filtered_log_s_mag = log_magnitude(np.abs(ft_filt_shift))
image_rec = IDFT_Numpy(ft_filt_shift, (rows, cols))
image_rec = np.expm1(abs(image_rec))
return image_rec, filt, filtered_log_s_mag
인자로 받아온 image에 대해 5단계의 호모모픽 필터링 처리 과정을 구현한다. 먼저 np.log1p() 함수를 사용하여 자연 로그로 변환해준다. 이후 푸리에 변환을 수행한다. 다음으로 make_filter를 통해 필터를 생성한 다음 앞에서 구현한 apply_filter() 함수를 사용해 filt를 적용한다. IDFT_Numpy() 함수를 통해 푸리에 역변환을 수행한 다음, np.expm1() 함수를 사용하여 지수 변환을 수행한다.
ap = argparse.ArgumentParser()
ap.add_argument('-i', '--image', required = True, \
help = 'Path to the input image')
args = vars(ap.parse_args())
filename = args['image']
i로 이미지의 경로를 입력받는다. 받아온 값은 filename 변수에 저장한다.
python homomorphic.py —image ../imagess/cup2.jpg 으로 명령을 주었을 경우
python homomorphic.py —image ../imagess/cup2_grayscale.jpg 으로 명령을 주었을 경우
python homomorphic.py —image ../imagess/cup2.jpg 으로 명령을 주었을 경우 (히스토그램 균일화 수행)
python homomorphic.py —image ../imagess/cup2_grayscale.jpg 으로 명령을 주었을 경우 (히스토그램 균일화 수행)
자세한 코드는 Github에서 확인할 수 있다.