몇 달 전, 학습데이터를 위한 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 |
---|