이전 'Global thresholding' 기법에 이은 'Adaptive thresholding' 내용입니다.
지역 이진화는 전역 이진화 처럼,
이미지 전체에 한 임계값을 적용하는 방식이 아닌,
이미지를 작은 영역(블록)으로 나누고, 각 블록마다 다른 임계값을 적용
하는 방식입니다.
즉, 이미지의 각 부분마다 다른 임계값을 적용하는 방식입니다.
각 부분마다 다른 임계값을 적용하기 때문에, 그림자와 같은 조명 변화에도
좀 더 탁월한 기법이라 볼 수 있습니다.
Mean Adaptive Thresholding 기법은
각 지역 부분에 대해 평균 값을 계산하여 그 지역의 픽셀을 이진화
하는 방식입니다.
적용 코드를 보아하면,
mean_bin = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 51, 15)
이렇게 구성되는데,
여기서 살펴볼 매개변수는 51(block size)과 15(C) 입니다.
위 이미지와 같이, 흑백 원본 이미지의 height값은 1440, width는 1080입니다.
여기서 51은 각 픽셀을 얼마만큼 나눌건지 설정하는 건데,
가장 많이 신경썼던 오른쪽 그림자 부분, 그리고 배경과 회색 부분(노란색 부분)을 잘 고려하는 설정값입니다.
뒤의 15 값은 Block 사이즈 기반으로 임계값 계산해서 얼마를 뺄지 설정해주는 값 입니다.
Mean Adaptive Thresholding 이기 때문에 각 블록 내에서 평균을 구하고,
10을 빼서 임계값을 설정합니다.
이 값을 크게 설정하면 임계값이 작아지므로 더 많은 픽셀이 흰색(255)으로 설정되게 됩니다.
이론은 흰색이 더 많이 들어가게 된다면,
자연스레 어두운 부분이 강조되어 배경이 어두워지는 효과를 가져온다고 하나,
C 값은 이미지만 보고 어느정도 해줘야 겠다 판단은 사실상 어려운 것 같습니다.
이건 직접 하나하나 적용 해보고 판단 해야합니다.
적용해보면,
전에 전역 이진화 방식을 적용했을 때의 오른쪽 그림자 부분까지
잘 나오는걸 확인할 수 있습니다.
이 방식은,
블록 내 픽셀 값에 가우시안 가중치를 적용하여 계산
하는 것 입니다.
Mean Adaptive Thresholding 방식은 해당 블록 안에서 평균값을 계산해서 그 블록 안의 값은 전부 동일 값이 유지된다고 하면,
Gaussian Adaptive Thresholding 방식은, 그 블록 내에서 중심에 위치한 픽셀값은 큰 값을,
주위 픽셀값은 중심값보다 작은 값으로 구성되게 됩니다.
두 방식의 자세한 차이는 밑에 참고자료 링크로 대체하겠습니다.
적용 코드를 보아하면,
gaus_bin = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 51, 15)
이렇게 구성됩니다.
각각의 매개변수 값은 위의 내용에서 확인해보시면 되고,
왼쪽 이미지는 Mean Adaptive Thresholding 방식을 적용한 것이고,
오른쪽 이미지는 Gaussian Adaptive Thresholding 방식을 적용한 것입니다.
오른쪽 이미지를 보면, 전보다 불필요한 가장자리 테두리 부분은 많이 제거(노이즈 제거)되었지만,
글씨 형태는 전보다 뭉개진게 보입니다.
가우시안 방식은 애초에 동일 값을 가진 필터를 적용하지 않기 때문에,
노이즈 제거에는 탁월하나,
작은 세부 정보가 좀 손상될 수 있습니다.
이론상으로는 Gaussian Adaptive Thresholding 기법이 OCR에 더 적합하다고 했으나,
지금 현재의 결과물만 봤을 때는 Mean Thresholding 기법이 좀 더 적합해 보입니다.
이는 모폴로지 연산을 통해 누락된 정보를 좀 살릴 수 있겠으나,
이것도 실제 적용을 해봐야 확실히 알 수 있을 것 같습니다.
다음 포스팅에서 뵙겠습니다.
감사합니당 ~ 🦾