과제 1. 앞서 사용한 보간법은 네 칸 중에서 대각선 상에 위치한 두 개의 픽셀에 대해서만 평균값을 구하여 사용한다.
대신에 네 칸 모두를 대상으로 픽셀 평균값을 계산하는 이미지 축소 함수 resize_half()
를 정의하라.
사용되는 매개변수와 의미는 다음과 같다.
imageName
: 이미지 어레이를 가리키는 변수 또는 값.
어레이의 dtype
은 0에서 255사이의 정수인 uint8
, 또는
0과 1사이의 부동소수점인 float64
이다.dtype
은 float64
.주의사항: 기본적으로 어레이 관련 연산, 메서드, 함수만 사용한다. for
반복문은 사용하지 않는다.
예를 들어, face
에 사용된 dtype
과 사용된 값들의 최대, 최소를 확인해보자.
import scipy.misc
face = scipy.misc.face()
face.dtype
face.min()
face.max()
어레이를 255로 나누면 float64
자료형이 된다.
(face/255).dtype
평균 연산을 하면 소수점이 나올 수밖에 없기에 이미지 어레이가 인자로 들어오면 무조건 0과 1사이의 부동소수점으로 변환을 한 다음에 이미지 크기를 조정하도록 해야 한다.
# pass와 None을 각각 적절한 코드와 값으로 대체해야 함.
def resize_half(imageName):
if imageName.dtype == 'uint8':
imageName = imageName/255
pass
return None
구현된 함수가 제대로 작동하는제 테스트하라.
face_half = resize_half(face)
assert face_half.shape == (384, 512, 3)
plt.imshow(face_half)
plt.show()
과제 2. 이미지의 픽셀 수를 임의의 지정된 비율로 줄이는 함수 resize_ratio()
를 선언하라.
사용되는 매개변수와 의미는 다음과 같다.
imageName
: 이미지 어레이를 가리키는 변수 또는 값.
어레이의 dtype
은 0에서 255사이의 정수인 uint8
, 또는
0과 1사이의 부동소수점인 float64
이다.ratio
: 양의 정수를 입력 받는 키워드 인자로 사용되며 기본값은 2.
기본값 2를 사용하면 resize_half()
함수와 동일하게 작동해야 함.
일반적으로, n
이 입력되면 n x n
개의 픽셀값들의 평균값을 이용해야 함.1/n
로 줄어든 3차원 넘파이 어레이. dtype
은 float64
.주의사항:
for
반복문을 어레이의 각 항목의 값을 지정하는 데에 사용하지는 말아야 한다.힌트:
np.hsplit()
함수와 sum()
메서드를 적절히 활용하면 for
반복문을 전혀 사용하지 않아도 된다.
다만, np.hsplit()
함수의 작동법이 그렇게 간단하지는 않다.
# pass와 None을 각각 적절한 코드와 값으로 대체해야 함.
def resize_ratio(imageName, ratio=2):
if imageName.dtype == 'uint8':
imageName = imageName/255
pass
return None
구현된 함수가 제대로 작동하는제 테스트하라.
face_half_ratio = resize_ratio(face)
assert face_half_ratio.shape == (384, 512, 3)
face_fourth = resize_ratio(face, 4)
assert face_fourth.shape == (192, 256, 3)
plt.imshow(face_fourth)
plt.show()