본문 바로가기

code/ML/DL

[OpenCV] OpenCV 이용하여 이미지 처리 - 이진화, 컬러맵, 적응형 이진화, 트랙바

몇 달 전, 학습데이터를 위한 OCR 모델 개발에 참여하면서 노트해두었던 자료들을 발견했다.
OpenCV를 이용한 이미지 처리 방식은 매우 많은데, 
그 중 이진화, 컬러맵, 적응형 이진화, 트랙바에 대해서 간단히 정리해보려한다. 기초주의.
발견한 김에 재정리하면서 일부 복기해보는 시간!

 

 이진화 Binarization 

이진화는 가장 간단한 세그멘테이션(segmentation) 방법이다.
세그멘테이션이란 이미지를 분할하여 원하는 부분 혹은 물체를 검출하는데 많이 사용되는 기법이다.

이진화는 원본 이미지를 그레이스케일 이미지로 변환한 후,  threshold값을 이용하여 배경과 물체를 분리해낸다.  
간단하게 설명하자면 임계값보다 크면 1, 아니면 0으로 반환한다.

 

import cv2


먼저 import 하기.

 

src = cv2.imread("./images/btsv_all.jpg", cv2.IMREAD_COLOR)

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()


임계값을 100으로 지정했다. 임계값은 결과에 따라 자유롭게 조절할 수 있다.
픽셀 값이 임계값 100보다 크면 value 값, 작으면 0으로 반환한다. 여기서 0은 검은색, 255는 흰색이다.

 

같은 임계값을 주었는데 픽셀이나 이미지 상태에 따라 결과는 천차만별이다.

 

하나 더 보자면,

src = cv2.imread("./images/road.jpg", cv2.IMREAD_COLOR)

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

도로 차선 이미지에 대한 이진화 결과이다.
차선 인식은 자율주행에 필요한 기본 요소인데, 평균 명도를 측정하여 이진화함으로써 차선 특징을 검출한다.
자율 주행을 위한 차선 인식 중 극히 일부분에 해당하는 프로세스이지만 꼭 필요한 프로세스이기도 하다! 

 

  • 플래그 설명
플래그 설명
cv2.THRESH_BINARY 픽셀 값이 임계값보다 크면 value 값, 작으면 0
cv2.THRESH_BINARY_INV 픽셀 값이 임계값보다 크면 0, 작으면 value 값
cv2.THRESH_TRUNC 픽셀값이 임계값보다 크면 임계값 그대로, 작으면 픽셀 값 그대로
cv2.THRESH_TOZERO 픽셀 값이 임계값보다 크면 픽셀 값 그대로, 작으면 0
cv2.THRESH_TOZERO_INV 픽셀 값이 임계값보다 크면 0, 작으면 픽셀 값 그대로
cv2.THRESH_MASK 마스크용 이미지로 변경
cv2.THRESH_OTSU 오츠(Otsu) 알고리즘을 적용하여 최적의 임계값 계산
cv2.THRESH_TRIANGLE 삼각형(Triangle) 알고리즘을 적용하여 최적의 임계값 계산

 

 

 컬러맵 Color Map 

Color Map을 사용하는 이유는,
  1. 데이터의 시각화를 위해 사용
  2. 색상의 분포표로 데이터를 쉽게 파악
  3. 픽셀값이 1:1로 매칭되어 선형구조나 비선형구조로 데이터 매핑이 가능하기 때문이다.

import cv2

img_org = cv2.imread("./images/road2.jpg")

img_map = cv2.applyColorMap(img_org, cv2.COLORMAP_OCEAN)
cv2.imshow("img_map", img_map)
cv2.waitKey(0)
cv2.destroyAllWindows()

 
 
  • applyColorMap 색상 맵 적용
파라미터 설명
src 입력 이미지
dst 적용된 이미지
colormap 색상 맵
userColor 사용자 정의 맵

 

 

 적응형 이진화 Adaptive Threshold 

입력 이미지에 따라 임계값이 스스로 다른 값을 할당할 수 있도록 구성된 이진화 알고리즘이다.
조명 변화나 반사가 심한 경우 어떠한 이미지냐에 따라 이진화 처리가 어려운 경우가 있는데,
이 경우 적응형 이진화 알고리즘을 적용한다면 더 나은 결과를 얻을 수 있다고 한다.

 

import cv2

src = cv2.imread("./images/road2.jpg")

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 467, 0)

cv2.imshow("binary", binary)
cv2.waitKey()
cv2.destroyAllWindows()

 

  • 플래그 설명
플래그 설명
cv2.ADAPTIVE_THRESH_MEAN_C 블록 크기 영역의 모든 픽셀에 평균 가중치를 적용
cv2.ADAPTIVE_THRESH_GAUSSIAN_C 블록 크기 영역의 모든 픽셀에 중심점으로부터 거리에 대한
가우시안 가중치를 적용

 

 

트랙 바 Track Bar 

이미지의 최적화된 상태를 트랙바로 조절하여 쉽게 찾을 수 있다.

def onChange(pos):
    pass
    
src = cv2.imread("./images/road2.jpg", cv2.IMREAD_GRAYSCALE)
cv2.namedWindow("Trackbar Windows")
cv2.createTrackbar("threshold", "Trackbar Windows", 0, 255, onChange)
cv2.createTrackbar("maxValue", "Trackbar Windows", 0, 255, lambda x:x) # 명암 조절 # lambda : 밝기의 절댓값
cv2.setTrackbarPos("threshold", "Trackbar Windows", 127) # 기본값 설정
cv2.setTrackbarPos("maxValue", "Trackbar Windows", 255) # 기본값 설정

while cv2.waitKey(1) != ord('q'):
    thresh = cv2.getTrackbarPos("threshold", "Trackbar Windows")
    maxval = cv2.getTrackbarPos("maxValue", "Trackbar Windows")
    
    _, binary = cv2.threshold(src, thresh, maxval, cv2.THRESH_BINARY) 
    # _ : 하이픈 연산자, 변수 선언 무시
    cv2.imshow("Trackbar Windows", binary)

cv2.destroyAllWindows()

 

  • createTrackbar 트랙바 생성
파라미터 설명
trackbarname 트랙바 이름
winname 윈도우 이름
value 트랙바의 초기 슬라이더 위치
count 트랙바의 슬라이더 최대 위치
onChange 슬라이더의 위치가 변경될 때마다 호출되는 함수
userdata 콜백 함수에 함께 전달할 임의의 사용자 데이터

 

  • getTrackbarPos 트랙바 위치 반환
파라미터 설명
trackbarname 트랙바 이름
winname 윈도우 이름
retval 현재 트랙바의 위치

 

 


 

[참고]
https://076923.github.io/docs/index

 

076923's Documentation | 076923 Documentation

Note: 라이브러리 및 프레임워크와 관련된 내용을 정리한 문서입니다. --> Welcome 안녕하세요. 개발자 윤대희입니다. 이 사이트는 라이브러리 및 프레임워크에 대한 문서, 교육, 및 참고 사항을 제

076923.github.io

https://bkshin.tistory.com/entry/OpenCV-8-%EC%8A%A4%EB%A0%88%EC%8B%9C%ED%99%80%EB%94%A9Thresholding

 

OpenCV - 8. 스레시홀딩(Thresholding), 오츠의 알고리즘(Otsu's Method)

이번 포스팅에서는 바이너리 이미지를 만드는 대표적인 방법인 스레시홀딩에 대해 알아보겠습니다. 이번 포스팅 역시 '파이썬으로 만드는 OpenCV 프로젝트(이세우 저)'를 정리한 것임을 밝힙니다

bkshin.tistory.com

 

'code > ML/DL' 카테고리의 다른 글

[OpenCV] OpenCV 설치 및 이미지 다루기 on Jupyter Notebook  (0) 2022.03.24