티스토리 뷰

교육/AIFFEL(대전)1기

[Exploration]np.where 활용

무엇보다_빛나는_샤트 2022. 2. 17. 00:09

2021.1.13 01:33

 

안녕하세요

프로그래밍을 배우는 빛나는 샤트입니다.

 

AIFFEL 대전 1기 Exploration 3장 카메라 스티커앱 만들기

*2021.01.12 (화)

 

그 중 np.where을 활용해 원본 이미지 + 고양이 수염 이미지를 어떻게 하는 지 고민한 결과를 정리해보려고 한다.

np.where의 활용부터 보자.

 

np.where(img_sticker==0,img_sticker, sticker_area).astype(np.uint8)

위 코드의 의미는 img_sticker이 0(검정)이면 img_sticker 값을 위치시키고 아니라면 sticker_area의 값을 위치시켜라 라는 의미이다. 고양이 수염은 검정색이기 때문에 위와 같이 설정하면 된다.

 

잠깐!

⚡원본 이미지에 스티커 이미지가 입혀지는 원리⚡

원본 이미지에 스티커 이미지가 들어갈 영역(여기서는 코 주위)의 이미지 픽셀값을 스티커 이미지의 픽셀값으로 바꿔치기 하는 것!

포토샵 프로그램과 같이 원본 이미지 위에 그냥 스티커 이미지를 붙여넣는것이 아니다.

원본 이미지의 픽셀값을 바꿔줘서 마치 '원본 이미지와 스티커 이미지가 합쳐진 것'처럼 보이는 것이다.

 

(예시) - 원본 이미지 속 스티커가 들어갈 영역 (파란 박스)

파란 박스는 스티커 영역(sticker_area)으로 설정해서 스티커 이미지(고양이 수염)의 픽셀값으로 대체해주면 된다.

하지만 고양이 수염 이미지의 전체를 대체하게 되면 입이라던가 볼 부분의 원본 이미지가 가려지게 된다.

즉, 고양이 수염 이미지 중 픽셀값이 검정이면 고양이 수염으로 표시하고 아니라면 원본 이미지 그대로 표현하는 것이 맞다.

 

(예시) - 원본 이미지 +스티커이미지 (고양이 이미지 영역: 파란 박스)

 

 

하지만 저 코드 앞에 하나가 더 있다.

img_bgr[좌측 상단 y 좌표 : 우측 하단 y 좌표, 좌측 상단 x 좌표 : 우측 하단 x 좌표] = \
np.where(img_sticker==0, img_sticker, sticker_area)

위 코드의 의미는 "원본 이미지 중 [ ] 내부에 해당하는 부분은 새로운 값을 재위치시켜라(where)"

[ ] 내부는 고양이 수염이 들어갈 영역이다. 그렇다면 아래와 같을 것이다.

 

원본 이미지[고양이 수염 영역] = np.where(검정이면 고양이 수염 픽셀을 위치시키고 아니라면 원본 이미지를 위치시켜라)

그렇다면 고양이 수염 영역을 알아내야 한다. (sticker_area)

 

"고양이 수염이 차지할 영역을 알기 위해서는 고양이 수염 이미지가 적당한 위치일 때의 고양이 수염 이미지 좌표값(좌측 상단, 우측 하단)을 알아내야 한다"

 

 1) 코 끝 좌표가 기준이 된다. 고양이 수염 이미지의 중앙이 될 것이다.

 2)  고양이 수염의 중앙이 코 끝과 일치하게 된다면 아래 그림처럼 된다.

 - 파란색 박스가 고양이 수염 이미지의 영역이다. 우리는 위에서 수염 중앙을 구했으므로 고양이 수염 영역도 간단한 수식을 통해 구할 수 있다!

(수식을 코딩으로 구현한 부분은 과제가 종료된 후 포스팅하겠습니다.)

 

 

⭐수정이 필요하거나 추가내용이 있다면 언제든 주세요⭐

LIST
댓글