colab환경에서 opencv를 활용한 배경제거 실습

2023. 6. 11. 23:52영상처리

이 글에서는 주어진 이미지의 전경 객체를 남기고 그 외의 배경을 제거하는 실습을 진행한다.

 

이 글에서 배경제거를 위한 동작의 순서는 다음과 같다.

 

1. Low - pass filtering(중간값 필터) : 잡음을 제거하고 성공적인 마스크 이미지를 만들기 위함

 

2. 히스토그램 스트레칭 : 이미지 전체 픽셀 값을 넓게 퍼트려 임계값을 적용시킬 때 좀 더 나은 결과를 보기 위함

 

3. 임계값을 적용 : 마스크 이미지를 만들기 위한 흰 색, 검은 색으로만 이루어진 이진 이미지를 만들어 낸다.

 

  - 여기서 사용된 이미지는 전경 객체의 밝은 부분과 어두운 부분의 픽셀 값 사이의 값을 가진 배경이 있어서 임계값을

    다르게 하여 2번 적용시켜 전경객체의 모양에 맞는 마스크 이미지를 생성하였다.

 

4. 두 임계값을 적용한 결과인 이진 이미지를 더하여 하나의 이미지를 만든다.

 

5. 윤곽선 추출 : 전격 객체와 배경이 명확하게 나누어진 모습을 위하여서 canny 함수를 사용하여 윤곽선을 추출한다.

 

6. 추출한 윤곽선과 4번에서 결과 이미지를 AND 연산한다.

 

7. 결과 출력

 

(좌) 사용된 이미지 / (우) 만들어진 마스크 이미지(임계값 적용+윤곽선)

 

전체 코드
from google.colab.patches import cv2_imshow
import numpy as np
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('/content/drive/MyDrive/image04.jpg', 0)

dst = cv2.medianBlur(img, 3) # Low-pass filtering
output_img = cv2.normalize(dst, None, 0, 255, cv2.NORM_MINMAX) # 히스토그램 스트레칭
border1, binary_img1 = cv2.threshold(output_img, 126,255,cv2.THRESH_BINARY) # 배경 픽셀값에 따라 임계값을 두 개를 설정한다.
border2, binary_img2 = cv2.threshold(output_img, 112,255,cv2.THRESH_BINARY_INV)
img_add = cv2.add(binary_img1, binary_img2) # 두 임계값을 통한 결과를 합친다.

canny_rst = cv2.Canny(dst,90,200) # canny - 필터 함수
img_add = cv2.add(canny_rst, img_add)
img_and = cv2.bitwise_and(img,img_add)

plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.title("image")
plt.imshow(img, cmap='gray')
plt.subplot(1,2,2)
plt.title("result")
plt.imshow(img_and, cmap='gray')

아래와 같은 결과를 확인할 수 있다.

결과 이미지

 

다른 이미지를 사용하게 되면 결과를 확인하면서 임계값을 바꾸어야 한다.

 

추가로 이미지와 의도에 맞는 적절한 알고리즘(스무딩, 윤곽선 추출 등)으로 바꾸어서 사용하면 좋은 결과를 확인할 수 있다.