본문 바로가기
AI, 빅데이터/AI

[OpenCV] 이미지 마스킹 기초

by Foxy현 2022. 10. 12.
728x90
반응형

안녕하세요! 오늘은 이미지의 특정 부분만 보이게 하는 이미지 마스킹에 대해 알아보겠습니다!

이미지 마스킹을 공부하기에 앞서 이미지 임계값 처리에 대한 내용에 대한 선 학습이 필요한데요,

2022.10.05 - [AI, 빅데이터/AI] - OpenCV - 이미지 트리밍 / 변환

 

OpenCV - 이미지 트리밍 / 변환

안녕하세요! 저번 글에 이어서 OpenCV 이미지를 다뤄보겠습니다. 2022.10.05 - [AI, 빅데이터/AI] - OpenCV - 색 지정 / 선 / 도형 그리기 저번에는 이미지를 만들었다면, 이번에는 직접 받아온 파일을 사용

foxyprogramming.tistory.com

임계값 처리하는 cv2.threshold에 대한 부분 먼저 읽고 오시면 좋을 것 같네요


OpenCV에서는 2진수 연산을 허용합니다.

이미지 처리에서 왠 2진수 연산이냐구요?

지금부터 차근차근 응용 방법에 대해 설명드리겠습니다.

OpenCV에서는 2개 혹은 한 개의 이미지에 대하여 2진수 연산을 수행합니다.

여기서 2개는 AND, OR, XOR에 해당하고, 한 개는 NOT 연산에 해당합니다.

 

이를 처리하는 함수로는

cv2.bitwise_and(img1,img2,mask)
cv2.bitwise_or(img1,img2,mask)
cv2.bitwise_xor(img1,img2,mask)
cv2.bitwise_not(img1)

각각 위에서 말한 and, or, xor, not 연산에 대한 함수가 있습니다.

여기서 mask 파라미터는 적용 영역 지정을 말합니다. 

 

먼저 검은색 이미지를 만들어보겠습니다!

이미지 만드는 내용 또한 이전 포스팅 참고하시면 좋을 것 같네요

2022.10.05 - [AI, 빅데이터/AI] - OpenCV - 색 지정 / 선 / 도형 그리기

 

OpenCV - 색 지정 / 선 / 도형 그리기

안녕하세요! 오늘은 컴퓨터비전 분야에서 주로 사용하는 OpenCV 라이브러리에 대해 알아보는 시간을 갖겠습니다. "OpenCV" Open Source Computer Vision의 약자로 영상 및 동영상 처리를 할 수 있는 오픈소

foxyprogramming.tistory.com

 

검은색 이미지 만들기

np.zeros((300,500),np.uint8)

300x500 크기의 행렬을 1바이트인 정수 0으로 채웁니다

이후, 연산을 확인하기 위한 간단한 원을 만들어주겠습니다.

A = np.zeros((300,500),np.uint8)
A = cv2.circle(A,(200,150),100,255,-1)
B = np.zeros((300,500),np.uint8)
B = cv2.circle(B,(300,150),100,255,-1)

circle에 해당하는 영역이 흰색이겠죠?

 

이제 연산을 해보면,

image1 = cv2.bitwise_and(A,B)
image2 = cv2.bitwise_or(A,B)
image3 = cv2.bitwise_xor(A,B)
image4 = cv2.bitwise_not(A)

의 결과가 나오네요

뭔가 이상하죠?

여기서 or 연산보다 and 연산이 더 작네요.

OpenCV는 검은색에 대한 and 연산을 수행합니다.

이점 유의하시길 바랍니다!

 

이렇게 배운 내용을 어떻게 써먹을까요? 그래서 2진수가 뭐 어쨌다는 걸까요?

 

print(img.shape[:2])
msk = np.zeros(img.shape[:2],np.uint8)
msk[2000:3500,2000:3000]=255 #흰색
cv2_imshow(msk)

색이 있는 이미지의 경우 3차원입니다.

우리는 2차원 연산을 수행할 것이기 때문에 img의 사이즈만 가져와서 사용하겠습니다.

이미지 전체를 검은색으로 만든 후, 특정 영역을 지정하여 흰색으로 지정합니다.

 

result_img = cv2.bitwise_and(img,img,mask=msk)
cv2_imshow(result_img)

이후 이 흰 부분과 원래 이미지와 and 연산을 하면 어떻게 될까요?

위의 and 연산의 그림을 보면 검은색에 먹히게 됐었죠?

이미지와 흰색의 and 연산을 하면 그 특정 부분의 이미지만 마스킹돼서 나오게 됩니다.

이미지를 다른 이미지의 검은색이라고 생각했을 때, 흰색이 0이고 그림이 1이라면 그 부분의 and 연산은 1이 됩니다.

따라서 흰 마스킹 부분에 그림이 들어갈 수 있습니다.


이렇게 봐도 이걸 언제 사용하는지 잘 모르실 것이라고 생각됩니다.

다음 글에서는 조금 더 왜 2진수 연산을 사용하는지에 대한 글을 가져오도록 하겠습니다!

감사합니다

 

 

 

 

728x90
반응형