오츠 이진화(Otsu)란? AI에서 밝기 분포로 이미지의 임계값을 자동으로 고르는 방법
TL;DR
오츠 이진화(Otsu)는 이미지의 밝기 히스토그램에서 두 집단을 잘 나누는 임계값을 자동으로 고르는 방법입니다. 각 집단의 비중과 평균 밝기 차이로 후보를 비교합니다. 고른 임계값을 픽셀에 적용하면 밝은 쪽과 어두운 쪽의 마스크를 만듭니다. 물체 이름을 학습하는 AI 모델은 아니며 조명·배경·대상 면적에 따라 원하는 영역과 다른 결과가 나올 수 있습니다.
핵심 3줄 요약
- 핵심 1
고정 숫자 대신 분포에서 경계를 찾습니다. 두 집단의 비중과 평균 차이를 함께 반영해 밝기를 나눌 기준을 선택합니다. - 핵심 2
임계값과 마스크는 다른 결과입니다. 기준 숫자를 고른 뒤 초과·이하 중 어느 쪽을 대상으로 남길지 정합니다. - 핵심 3
통계상의 최적과 정답은 다릅니다. 그림자·잡음·작은 대상을 포함한 실제 자료에서 마스크와 후속 작업을 점검합니다.
이 글에서 다룰 내용
- 오츠 이진화의 한 문장 정의
- 여덟 밝기값으로 이해하는 임계값 선택
- 히스토그램·집단 비중·평균 차이의 계산 순서
- 임계값과 마스크, 주요 API 설정의 뜻
- 특징 이진화·이미지 분할·캐니·적응형 임계값과의 차이
- 문서와 영상 전처리의 사용처 및 실전 체크리스트
- 조명·대상 비율·동점·평가에서 주의할 점
오츠 이진화를 한 문장으로 정의하면 무엇인가요?
오츠 이진화는 회색조 밝기를 두 집단으로 나눌 때 집단 사이 분산을 최대화하는 임계값을 찾아 이진 마스크 생성에 쓰는 영상 처리 방법입니다.
영어로는 Otsu’s method 또는 Otsu thresholding이라고 부릅니다. 오쓰·오쯔라는 표기도 같은 방법을 가리킵니다. 이 글은 영상 전체에 하나의 기준을 적용하는 기본 전역 방식을 설명합니다. 여기서 두 집단은 밝기 구간이며 고양이·자동차처럼 학습한 의미 범주가 아닙니다.
scikit-image 공식 임계값 안내는 집단 사이 분산을 최대화하는 것과 가중한 집단 내부 분산을 최소화하는 것이 같다고 설명합니다. 한 집단 안에서는 밝기가 덜 퍼지고 두 집단은 떨어지도록 기준을 찾습니다. 사람이 붙인 정답 마스크의 정확도를 직접 최대화하는 계산은 아닙니다.
한 줄 정리: 오츠 방법은 밝기의 분포에서 나눌 선을 고릅니다. 그 선의 위쪽과 아래쪽 중 무엇이 대상인지는 작업의 정의로 정합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 밝기값
[0, 0, 1, 1, 4, 4, 5, 5]
을 가진 작은 회색조 영상을 본다고 가정해 보겠습니다. 낮은 값은 어둡고 높은 값은 밝습니다. 정수 임계값의 후보를 0부터 4까지 두고 기준 이하와 초과로 나눠 보는 직접 만든 예시입니다.
임계값을 1로 고르면 어두운 쪽은
[0, 0, 1, 1]
, 밝은 쪽은
[4, 4, 5, 5]
입니다. 두 집단은 각각 전체의 절반이며 평균은 0.5와 4.5입니다. 두 비중과 평균 차이의 제곱을 곱한 집단 사이 분산은 4입니다.
임계값을 0으로 고르면 비중은
1/4
과
3/4
이고 집단 사이 분산은
25/12
로 줄어듭니다. 이 배열에서는 1·2·3이 모두 같은 최대값을 냅니다. 빈 밝기 구간 안에서 선을 움직여도 실제로 나뉘는 픽셀은 같기 때문입니다.
확인한 scikit-image 구현은 최대값이 처음 나타나는 히스토그램 위치를 고릅니다. 이 정수 예시에서는 임계값 1에 해당하며
image > t
로 마스크를 만들면
[0, 0, 0, 0, 1, 1, 1, 1]
입니다. 두 봉우리 사이의 가운데 숫자 2.5를 반드시 돌려준다고 이해하면 안 됩니다.
본문의 분수·후보 점수·마스크는 Python 표준 라이브러리의 정확한 분수 연산으로 확인했습니다. scikit-image나 OpenCV 함수를 실행한 결과, 실제 사진의 분할 정확도를 측정한 결과는 아닙니다. 실제 호출에서는 자료형과 히스토그램 구간까지 고정해 대조합니다.
쉬운 예시: 오츠 방법은 임의의 보기 좋은 숫자를 고르기보다, 후보마다 밝기가 두 집단으로 얼마나 잘 갈리는지 비교합니다. 같은 최적 분할을 만드는 숫자가 여러 개일 수도 있습니다.
왜 AI에서 오츠 이진화가 중요한가요?
영상 전처리의 간단한 기준을 만듭니다
원본 회색조 영상에서 밝고 어두운 영역을 나누는 기준 결과를 만들 때 검토할 수 있습니다. 복잡한 분할 모델과 비교하기 전, 밝기만으로 어느 부분까지 구분하는지 확인하는 용도입니다. 매 이미지에서 임계값을 다시 구한다면 그 처리 규칙도 평가와 운영에서 같게 유지합니다.
임계값을 고르는 과정과 적용을 나눕니다
특징 이진화는 정한 기준으로 수치 입력을 두 값으로 바꾸는 일반 전처리입니다. 오츠 방법은 영상의 히스토그램으로 그 기준을 계산하는 특정 방법입니다. 어떤 선을 골랐는지와 픽셀을 어느 쪽에 배정했는지를 따로 기록하면 반전이나 단위 오류를 찾기 쉽습니다.
학습 모델 없이도 실패 조건을 관찰합니다
기본 계산에는 라벨 데이터로 신경망 가중치를 학습하는 단계가 없습니다. 그래서 라벨이 적을 때 밝기 분할의 가능성을 먼저 살피는 기준으로 검토합니다. 다만 정답이 필요 없다는 말은 품질 평가도 필요 없다는 뜻이 아닙니다. 실제 대상과 마스크가 일치하는지는 별도의 확인 사항입니다.
핵심 인사이트: 자동으로 정하는 것은 밝기 임계값입니다. 대상의 의미, 올바른 면적과 업무 성공 여부는 그 숫자만으로 결정되지 않습니다.
오츠 이진화는 어떤 순서로 작동하나요?
1. 회색조 영상과 히스토그램을 준비합니다
각 밝기값이 몇 번 나오는지 집계합니다. 색상 영상은 회색조로 바꾸는 규칙부터 정합니다. 영상 전체의 히스토그램을 쓰는 기본 방식은 픽셀의 위치나 이웃 관계를 점수에 넣지 않습니다. 밝기 분포가 같다면 픽셀 배치를 섞어도 후보별 점수는 같습니다.
2. 각 후보로 두 집단의 비중과 평균을 구합니다
기준 이하와 초과의 밝기 구간으로 나누고 각 집단의 픽셀 비율과 평균을 계산합니다. 양쪽 모두 픽셀이 있는 후보를 비교합니다. 단순히 두 평균 사이 거리만 크게 만드는 방식으로 설명하지 않습니다. 작은 집단과 큰 집단의 비중도 점수에 포함됩니다.
3. 집단 사이 분산이 가장 큰 기준을 고릅니다
집단 비중을 w0·w1, 평균 밝기를 m0·m1이라 하면 점수는
w0 * w1 * (m0 - m1)**2
로 쓸 수 있습니다. 비중을 쓰는 이 식과 공식 구현에서 누적 횟수로 계산한 점수는 전체 픽셀 수가 고정일 때 최대 위치가 같습니다. 구현의 중간 숫자를 그대로 확률이라고 부르지는 않습니다.
전체 분산이 고정된 상태에서는 가중한 집단 내부 분산을 줄이는 설명과 연결됩니다. 앞 예시의 최적 분할에서 가중한 내부 분산은 0.25입니다. 이 최적성은 밝기 분포와 정한 기준식 안에서의 성질입니다. 결함 검출이나 문자인식 성공률의 최적성을 뜻하지 않습니다.
4. 비교 방향을 정해 마스크를 만듭니다
밝은 대상을 남기려면
image > t
, 어두운 대상을 남기려면
image <= t
처럼 비교를 정합니다. 같은 임계값이어도 두 식의 전경은 반대입니다. 이 글에서 전경은 남길 대상 픽셀입니다. 흰색이나 숫자 1이 언제나 원하는 물체라는 보장은 없습니다.
실전 팁: 원본·전처리 영상·히스토그램·임계값·마스크를 함께 저장하세요. 기준 선택의 변화와 마스크 반전, 배경 혼입을 나눠 확인하기 좋습니다.
주요 설정과 결과는 어떻게 읽나요?
scikit-image는 먼저 임계값 숫자를 반환합니다
공식 API의
threshold_otsu
는 마스크가 아니라 임계값을 돌려줍니다. 반환값으로 원본 배열을 비교해 마스크를 따로 만듭니다. 기본
nbins=256
은 히스토그램의 구간 수이며 정수 배열에서는 무시됩니다. 정수 영상의 밝기를 자동으로 256단계로 줄이는 설정은 아닙니다.
실수 영상에서는 히스토그램 구간 선택이 기준에 영향을 줄 수 있습니다.
hist
로 분포를 직접 공급할 때는 횟수와 밝기 구간 중심의 대응을 확인합니다. 횟수만 주면 구현은 순서 번호를 밝기 좌표로 사용합니다. 이 글에서는 입력 영상과 외부 히스토그램 중 하나만 골라 쓰는 방식으로 점검합니다.
OpenCV의 두 반환값은 서로 다릅니다
OpenCV 공식 안내는
cv.threshold
에
cv.THRESH_BINARY + cv.THRESH_OTSU
를 지정하는 예를 보여줍니다. 첫 반환값은 선택한 임계값, 둘째는 처리한 영상입니다. 이 모드의 예제에서 넘긴 기준 0은 자동 계산을 막는 고정 경계가 아닙니다.
예제의 최대 출력값 255는 마스크에서 높은 쪽에 기록할 값입니다. 선택한 임계값이 255라는 뜻이 아닙니다. 다른 API의 불리언 마스크와 비교할 때는 저장값의 척도와 전경 방향을 맞춥니다. 함수 이름이 비슷해도 입력 자료형과 반환 계약은 각 도구 문서에서 따로 확인합니다.
기본 전역 방식과 다중·국소 변형을 구분합니다
threshold_multiotsu
는 여러 밝기 집단을 나눌 경계들을 반환합니다.
classes=3
이면 임계값은 2개이며, 각각에 의미 범주를 붙여 주는 학습 모델은 아닙니다. 클래스 수를 늘린다고 개별 물체가 자동으로 분리되는 것도 아닙니다.
공식 안내에는 이웃 영역마다 오츠 기준을 구하는
rank.otsu
도 등장합니다. 기본
threshold_otsu
가 자동으로 국소 모드로 바뀌는 것은 아닙니다.
threshold_local
의 가중 평균 방식과 국소 오츠 역시 서로 다른 계산이므로 함수와 영역 크기를 함께 기록합니다.
오츠 이진화와 헷갈리는 용어는 무엇이 다른가요?
고정 이진화·분류 임계값과의 차이
고정 이진화는 미리 정한 숫자로 값을 나눕니다. 오츠 방법은 밝기 분포에서 나눌 숫자를 구합니다. 분류 임계값은 모델이 낸 확률이나 점수를 최종 판정으로 바꾸는 기준입니다. 영상 밝기의 경계와 예측 확률의 경계는 단위와 적용 단계가 다릅니다.
적응형 임계값·캐니 에지 검출과의 차이
적응형 방식은 주변 영역에 따라 다른 기준을 사용하므로 조명이 고르지 않은 영상에서 비교할 후보입니다. 캐니 에지 검출은 밝기 변화의 경계를 가는 선으로 남깁니다. 오츠 마스크의 채워진 밝기 영역과 캐니의 경계선을 같은 출력으로 보지 않습니다.
이미지 분할·K-means와의 차이
이미지 분할은 픽셀을 영역으로 나누는 더 넓은 작업입니다. 오츠 방법은 밝기로 두 영역을 만드는 간단한 방법이며 의미를 학습한 분할 모델 전체를 대신하지 않습니다. K-means는 중심점과 표본 배정을 반복하는 군집화입니다. 결과가 비슷해 보여도 임계값 후보를 비교하는 오츠의 계산과 구분합니다.
비교 정리: 이진화는 두 값으로 바꾸는 처리, 오츠는 밝기 경계를 고르는 방법, 적응형은 위치별 기준, 캐니는 경계선 검출, 이미지 분할은 영역을 나누는 작업입니다.
실전에서는 어디에 쓰이나요?
문서와 대비가 뚜렷한 영역을 전처리합니다
밝은 배경의 어두운 글자처럼 밝기로 대상을 나눌 수 있는 입력에서 검토합니다. 문서라면 어두운 쪽을 전경으로 골랐는지 확인합니다. 그림자나 종이 얼룩이 섞이면 글자 일부가 사라지거나 배경을 남길 수 있으므로 원본과 확대 마스크를 함께 봅니다. OCR 개선 여부는 실제 인식 오류로 따로 측정합니다.
분할 파이프라인의 기준 결과를 만듭니다
고정 임계값, 전역 오츠와 국소 방식의 마스크를 같은 표본에서 비교할 수 있습니다. OpenCV 안내는 잡음 영상에서 가우시안 평활화 후 오츠를 적용한 예를 보여줍니다. 평활화는 작은 구조와 경계도 바꾸므로 해당 예시를 모든 영상의 개선 보장으로 일반화하지 않습니다.
오츠 이진화를 적용할 때 어떤 순서로 확인하나요?
1. 입력 범위와 전경의 의미를 고정합니다
회색조 변환·자료형·밝기 범위·잘라낼 영역을 정합니다. 대상이 밝은지 어두운지, 임계값과 같은 픽셀은 어느 쪽인지 적습니다. 전처리로 잘라낸 범위가 달라지면 히스토그램도 달라지므로 파일 경로만 같다고 같은 조건으로 보지 않습니다.
2. 기준 숫자와 마스크를 따로 검사합니다
작은 배열로 임계값 선택과 비교 방향을 확인합니다. 모든 픽셀의 밝기가 같은 경우도 넣습니다. 확인한 scikit-image 구현은 상수 영상에서 그 밝기값을 반환하며, 그때 초과 비교는 모두 거짓이고 이하 비교는 모두 참입니다. 숫자가 반환됐다는 사실만으로 두 집단을 제대로 찾았다고 판정하지 않습니다.
3. 촬영 조건별 정답과 후속 결과를 비교합니다
정답 마스크가 있다면 대상 누락·배경 혼입·작은 구조의 손실을 확인합니다. 같은 원본의 잘린 조각을 훈련·평가 양쪽에 섞지 말고 장면이나 촬영 세션을 기준으로 나눕니다. 평활화와 영역 선택을 비교하며 최종 평가 자료에 맞춰 계속 설정을 바꾸지 않습니다. 처리 시간과 후속 인식 오류도 별도로 남깁니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 봉우리 두 개가 없으면 실행 불가라고 단정하지 않습니다. 두 집단이 잘 떨어진 분포는 해석하기 좋은 조건입니다. 일반 입력에서도 기준은 나올 수 있지만, 그 결과가 업무의 대상·배경 구분과 맞는지는 별도 문제입니다. 봉우리의 정확한 중간점을 찾는 알고리즘으로도 설명하지 않습니다.
둘째, 조명과 대상 면적 비중을 확인합니다. 영상 일부의 그림자가 다른 밝기 집단을 만들거나 배경이 대부분을 차지하면 원하는 대상보다 다른 밝기 차이를 나눌 수 있습니다. 전역 방식은 같은 밝기값에 위치별로 다른 기준을 적용하지 않습니다. 대표 실패 영상을 보존해 국소 방식과 비교합니다.
셋째, 전경 픽셀 수를 곧 물체 수로 읽지 않습니다. 떨어진 여러 물체나 붙은 두 물체도 같은 밝기 쪽에 들어갈 수 있습니다. 마스크를 얻은 뒤 연결 영역이나 후속 분리 절차가 필요한지 정합니다. 실제 면적을 계산할 때는 픽셀 크기와 촬영 배율도 필요합니다.
넷째, 임계값 변화만으로 모델 성능을 판단하지 않습니다. 조명·구간·영역 크기가 달라지면 값이 움직일 수 있습니다. 높은 기준이 더 정확하다는 뜻은 아닙니다. 원본·마스크·업무 오류를 함께 대조하고 처리 조건을 버전으로 남깁니다.
주의: 오츠의 최적 기준은 밝기 통계에 대한 답입니다. 자연스러운 흑백 마스크나 하나의 임계값이 의미 인식·정확한 물체 수·문자인식 성공을 보증하지 않습니다.
자주 묻는 질문
Q1. 오츠 이진화는 딥러닝 모델인가요?
기본 방법은 밝기 히스토그램의 통계를 비교하는 영상 처리입니다. 신경망의 가중치를 학습하는 과정은 없습니다. AI 파이프라인의 전처리나 비교 기준으로 사용할 수 있지만 의미 범주를 자동으로 배우지는 않습니다.
Q2. 임계값을 반환하면 흑백 영상도 생기나요?
scikit-image의 threshold_otsu는 숫자를 반환하므로 그 숫자와 입력 영상을 비교해 마스크를 따로 만듭니다. OpenCV threshold는 기준 숫자와 처리 영상을 함께 반환합니다. 두 API의 반환 순서와 형태를 구분합니다.
Q3. 밝은 쪽이 항상 전경인가요?
아닙니다. 전경은 작업에서 남기려는 대상입니다. 어두운 글자를 남긴다면 이하 쪽을 선택할 수 있습니다. 비교 연산과 임계값 자체가 같은 픽셀의 처리를 함께 기록합니다.
Q4. 두 밝기 봉우리의 중간값이 나오나요?
반드시 그렇지 않습니다. 두 집단의 비중과 평균 차이로 후보를 비교합니다. 같은 분할을 만드는 경계가 여러 개라면 동점도 생깁니다. 이 글에서 확인한 구현은 처음 최대값에 해당하는 구간 중심을 반환합니다.
Q5. 영상마다 임계값이 달라도 되나요?
매 영상의 히스토그램에서 다시 계산하는 전역 오츠라면 값이 달라질 수 있습니다. 고정 기준과 다른 운영 방식입니다. 영상마다 다시 계산할지 공통 기준을 적용할지 먼저 정하고 평가와 배포에서 같은 절차를 사용합니다.
Q6. 조명이 고르지 않아도 자동으로 해결하나요?
하나의 전역 기준만으로는 부족할 수 있습니다. 공식 안내처럼 적응형 또는 국소 오츠를 비교합니다. 이웃 크기·잡음·작은 글자 손실이 함께 달라지므로 실제 원본과 정답에서 확인합니다.
출처
마무리
오츠 이진화는 밝기 히스토그램을 두 집단으로 나누는 임계값을 자동으로 고르는 방법입니다. 집단 비중과 평균 차이로 기준을 선택하는 단계, 그 숫자로 마스크를 만드는 단계, 실제 대상과 일치하는지 평가하는 단계를 구분하면 출력의 뜻을 정확히 파악할 수 있습니다.
감자나라ai님이 처음 적용한다면 작은 배열에서 임계값과 초과·이하 마스크부터 확인해 보세요. 원본의 밝기 범위와 전경 의미를 고정하고 히스토그램·기준·결과를 함께 남깁니다. 그림자·작은 대상·상수 영상을 포함한 자료에서 누락과 후속 인식 오류를 확인하는 것이 출발점입니다.
