Image Transforms 실습

Stella Kim·2021년 7월 17일
0

Image Processing

목록 보기
7/8
post-thumbnail

JPEG DCT Demo

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를 수행한다.

실행 결과

  • python dct_block_test.py —image ../imagess/macaron.jpg 으로 명령을 주었을 경우

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에서 확인할 수 있다.

profile
취업 준비 용으로 사용했던 기술 블로그입니다. 이제는 업로드 거의 안 할지도..

0개의 댓글