[카테고리:] <span>OpenCV in Colab</span>

안녕하세요. 언제나휴일의 언휴예요.

영상 처리를 하다 보면 많은 시간을 요구하는 작업이 자주 있습니다.

이 때 칼라 이미지를 흑백으로 전환한 후에 처리를 할 때가 많습니다.

칼라 이미지는 3채널이고 흑백 이미지는 1채널이어서 영상 처리 계산 속도를 1/3로 줄일 수 있어요.

그리고 흑백 이미지로 전환한 후에 기준 값보다 크거나 작을 때 원하는 값으로 변환하는 Threshold 작업도 속도를 줄이기 위한 전처리 작업 중 하나입니다.

칼라 이미지를 흑백으로 전환

원본 이미지는 티켓 사진으로 할게요. (예전 드골 공항에서 택시 기사님이 찍어 달라고 해서 찍었던 사진입니다.)

원본 이미지
원본 이미지

필요한 import 구문을 먼저 작성할게요.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

이미지를 로딩한 후에 크기를 너비 320, 높이 200인 이미지로 변환하기로 할게요.

path = '/content/drive/MyDrive/files/ticket.jpg'
image = cv2.imread(path,cv2.IMREAD_COLOR)
src_image = cv2.resize(image,dsize=(320,200),interpolation=cv2.INTER_AREA)

컬러 이미지를 흑백 이미지로 전환합시다. cvtColor 메서드는 이미지 변환에 사용하는 메서드입니다. 이미지와 옵션을 COLOR_BGR2GRAY를 전달하면 컬러 이미지를 흑백 이미지로 전환할 수 있어요.

gray_image = cv2.cvtColor(src_image,cv2.COLOR_BGR2GRAY)

이제 이미지를 시각화하여 확인해 봅시다.

cv2_imshow(src_image)
cv2_imshow(gray_image)
흑백 전환 이미지
흑백 전환 이미지

다음은 지금까지 작성한 소스 코드입니다.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

path = '/content/drive/MyDrive/files/ticket.jpg'
image = cv2.imread(path,cv2.IMREAD_COLOR)
src_image = cv2.resize(image,dsize=(320,200),interpolation=cv2.INTER_AREA)

gray_image = cv2.cvtColor(src_image,cv2.COLOR_BGR2GRAY)
cv2_imshow(src_image)
cv2_imshow(gray_image)

특정 값을 기준으로 Threshold, 이진화

특정 값을 기준으로 이진화 작업을 해 봅시다.

cv2의 threshold 메서드에 흑백 이미지, 기준값과 원하는 값, cv2.THRESH_BINARY 옵션을 전달하면 이진화를 지정합니다.

기준값보다 작으면 0으로 지정하고 크면 원하는 값으로 전환해 줍니다.

_, bin_image = cv2.threshold(gray_image,127,255,cv2.THRESH_BINARY)
cv2_imshow(bin_image)
cv2_imshow(bin_image)
이진화 이미지
이진화 이미지

이번에는 threshold 메서드의 마지막 인자 cv2.THESH_BINARY_INV를 전달하면 이진화 역 변환을 해 줍니다.

_, bin_inv_image = cv2.threshold(gray_image,127,255,cv2.THRESH_BINARY_INV)

cv2_imshow(bin_inv_image)
이진화 역 이미지
이진화 역 이미지

마지막 인자를 THRESH_TRUNC로 전달하면 기준값보다 작으면 그대로, 크면 value로 바꿔줍니다.

_, tru_image = cv2.threshold(gray_image,127,255,cv2.THRESH_TRUNC)

cv2_imshow(tru_image)
THRESH_TRUNC 이미지
THRESH_TRUNC 이미지

마지막 인자를 THRESH_TOZERO로 전달하면 작으면 0, 크면 그대로 바꿔줍니다.

_, zer_image = cv2.threshold(gray_image,127,255,cv2.THRESH_TOZERO)
cv2_imshow(zer_image)
THRESH_TOZERO 이미지
THRESH_TOZERO 이미지

마지막 인자를 THRESH_TOZERO_INV로 전달하면 THRESH_TOZERO 전환의 역으로 바꿔줍니다.

_, zer_inv_image = cv2.threshold(gray_image,127,255,cv2.THRESH_TOZERO_INV)

cv2_imshow(zer_inv_image)
THRESH_TOZERO_INV
THRESH_TOZERO_INV

cv2.adaptiveThreshold 메서드는 주변의 값에 의해 변환하는 메서드입니다.

cv2.adaptiveThreshold(image, value, method, flag, block_size, bias)

image: 이미지

value: 적용할 값

method: 평균 or 가우시안

flag: threshold 적용 방법

block_size: 이웃의 크기

bias: 보정값

다음은 주변 값의 평균과 가우시안에 의해 변환하는 예제입니다.

adp_mean_image = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
adp_gaus_image = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3)
cv2_imshow(adp_mean_image)
cv2_imshow(adp_gaus_image)
이웃의 평균으로 변환한 이미지
이웃의 평균으로 변환한 이미지
이웃 이미지를 가우시안 적용한 이미지
이웃의 가우시안 적용한 이미지

OpenCV in Colab