이진화
적응형 이진화
전체 이미지에 하나의 임계값을 사용하는 threshold함수살펴 봄
[PROBLEM]
이미지 일부가 너무 어두운 경우,
1) 하나의 임계값을 사용하여 이진화하여 좋은 결과를 얻기가 힘듦
2) 밝기가 적당한 영역과 너무 어두운 영역을 동시에 만족하는 임계값이 없음
[SOLUTION]
적응형 이진화 Adaptive thresholding 이미지를 작은 영역으로 나누어 각 영역별로 다른 임계값을 사용하는 방법.
적응형 이진화를 위해 OpenCV에서는 adaptive Threshold
함수를 제공.
코드
adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
- src- 소스 (입력) 이미지를 나타내는 클래스 Mat 의 객체
- dst- 대상 (출력) 이미지를 나타내는 클래스 Mat 의 객체
- maxValue- 픽셀 값이 임계 값보다 큰 경우 제공되는 값을 나타내는 이중 유형의 변수
- adaptiveMethod- 사용할 적응 방법을 나타내는 유형의 정수 변수. 다음 두 값 중 하나
- ADAPTIVE_THRESH_MEAN_C- 임계 값은 이웃 지역의 평균
- ADAPTIVE_THRESH_GAUSSIAN_C- 임계 값은 가중치가 가우시안 창인 인접 값의 가중치 합계
- thresholdType- 사용할 임계 값의 유형을 나타내는 정수 유형의 변수.
- blockSize- 임계 값을 계산하는 데 사용되는 pixelneighborhood의 크기를 나타내는 정수 유형의 변수.
- C- 두 방법에서 사용되는 상수를 나타내는 이중 유형의 변수 (평균 또는 가중 평균에서 뺀 값).
C++
# include < opencv2/opencv.hpp> # include < iostream>
using namespace cv;
using namespace std;
int main()
{ // 이미지를 읽어옵니다.
Mat img_color;
img_color = imread("copy.png", IMREAD_COLOR);
if (img_color.empty())
{
cout << "이미지 파일을 읽을 수 없습니다." << endl;
return - 1;
}
// 그레이 스케일 이미지로 변환합니다.
Mat img_gray;
cvtColor(img_color, img_gray, COLOR_BGR2GRAY);
// 그레이 스케일 이미지에 적응형 이진화를 적용합니다.
Mat img_binary;
adaptiveThreshold(img_gray, img_binary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 5, 4);
// 결과 이미지를 보여줍니다.
imshow("Grayscale", img_gray);
imshow("Binary", img_binary);
waitKey(0);
}
PYTHON
import cv2 as cv
import sys
# 이미지를 읽어옵니다.
img_color = cv.imread("copy.png", cv.IMREAD_COLOR)
if img_color is None:
print("이미지 파일을 읽을 수 없습니다." )
sys.exit(1)
# 그레이 스케일 이미지로 변환합니다.
img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
# 그레이 스케일 이미지에 적응형 이진화를 적용합니다.
img_binary = cv.adaptiveThreshold(img_gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 5, 4);
# 결과 이미지를 보여줍니다.
cv.imshow('Grayscale', img_gray) cv.imshow('Binary', img_binary) cv.waitKey(0)