이미지에서 우리가 원하는 영역을 찾거나 추출할 때 필요한 방법이 이진화 Binarization 입니다. 물체 탐색, 물체 추적, 이미지 분할 등 알고리즘을 구현할 때 필수적으로 사용해야하는 기법이 이진화 기술들입니다. 이진화 방법에는 다양한 기술들이 있으며, OpenCV 에서 제공하는 기술들 중 하나인 적응적 이진화 기술 Adaptive Thresholding Method에 대해 알아보겠습니다.
이진화 방법은 크게 전역적 처리 Global Processing과 지역적 처리 방법 Local Processing 방법으로 구분할 수 있습니다. OpenCV에서 제공하는 “adaptiveThreshold” 방법은 지역적 처리 방법과 적응적 방법이 합쳐진 이진화 방법입니다. Python에서는 아래와 같이 “cv2.adaptiveThreshold” 명으로 적용해 볼 수 있으며, 입력 변수는 아래와 같습니다.
[Python] dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
(입력 변수 설명)
- src: 입력 이미지 (Gray Scale Image)
- maxValue: 임계값 Threshold을 초과한 픽셀에 적용할 값 (일반적으로 255)
- adaptiveMethod: 1) cv2.ADAPTIVE_THRESH_MEAN_C, 2) cv2.ADAPTIVE_THRESH_GAUSSIAN_C
- thresholdType: 1) cv2.THRESH_BINARY, 2) cv2.THRESH_BINARY_INV
- blockSize: 픽셀 임계값을 계산할 영역 크기 (홀수: 3, 5, 7 ...)
- C: 계산된 임계값에서 빼는 상수 (일반적으로 0 또는 2~10)
여기서 “cv2.ADAPTIVE_THRESH_MEAN_C”는 “blockSize”가 3이라면 3x3 크기 영역 안에 평균 값에서 “C”를 뺀 값을 임계값으로 사용하게 됩니다. “cv2.ADAPTIVE_THRESH_GAUSSIAN_C”는 3x3 크기 영역 안에 가우시안 가중 평균값에서 “C”를 뺀 값을 임계값으로 사용합니다. 앞에서 언급했듯이 “blockSize”는 3은 3x3, 5는 5x5의 블럭을 의미하며 블럭 크기가 작아질 수록 잡음 Noise에 민감해지고 너무 크면 지역적 처리의 이점이 줄어들 수 있으니 설정 시 고민이 필요할 수 있습니다.
C/C++ 코드를 사용한다면 아래와 같이 사용할 수 있습니다. 파이썬 함수와 다르게 결과 이미지는 입력 변수와 함께 설정해야 합니다. (dst = 결과 이미지)
[C/C++] adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
지역적이면서 적응적 이진화 방법은 이미지에 조명이 균일하지 않거나 배경이 복잡하여 명암이 불균일한 경우 유용할 수 있으며, 문서 이미지에서 문자 추출 시에도 잘 활용될 수 있습니다. 아래는 파이썬과 C/C++에서 “adaptiveThreshold”를 활용한 예이니 참고해서 보면 좋을 듯 합니다.
import cv2
# 그레이 이미지 읽기
img = cv2.imread('grayimage.jpg', cv2.IMREAD_GRAYSCALE)
# 가우시안 적응형 이진화
thresh = cv2.adaptiveThreshold(
img,
255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
11,
2
)
cv2.imshow("Adaptive Threshold", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 이미지 불러오기 (그레이스케일)
Mat src = imread("grayimage.jpg", IMREAD_GRAYSCALE);
Mat dst;
// 적응형 이진화 적용
adaptiveThreshold(
src, // 입력 이미지
dst, // 출력 이미지
255, // 최대값
ADAPTIVE_THRESH_GAUSSIAN_C, // 적응형 방법
THRESH_BINARY, // 임계값 타입
7, // 블록 크기 (홀수)
2 // C 상수
);
// 결과 출력
imshow("Original", src);
imshow("Adaptive Threshold", dst);
waitKey(0);
return 0;
}
'영상처리 도구' 카테고리의 다른 글
OpenCV 영상처리 외곽선 추출과 응용 findContours (0) | 2025.06.08 |
---|---|
OpenCV 영상 처리 영역 분할 floodFill (0) | 2025.06.04 |
딥러닝, 컴퓨터 비전, 영상처리 라이브러리 Image Processing Library (0) | 2025.05.18 |
OpenCV 영상처리 기술 보간법 Interpolation (0) | 2025.05.15 |
OpenCV 칼라 처리 및 변환 cvtColor (0) | 2023.12.10 |