본문 바로가기
AI 컴퓨터 비전프로젝트

[DL] 적응형이진화(cv2.adaptiveThreshold())+자동이진화 적응형, 가우시안 비교

by 바다의 공간 2024. 10. 4.

#adaptive

 

5. 적응형 이진화
- 영상을 여러 영역으로 나눈 뒤, 그 주변 픽셀 값만 활용하여 임계값을 구함
- cv2.adaptiveThreshold()
    cv2.ADAPTIVE_THRESH_MEAN_C
    -이웃 픽셀의 평균으로 결정
    - 선명하지만 잡티가 많아질 가능성이 있음
    - 문서 스캔과 같이 이미지가 고르게 조명된 경우에 효과적
   cv2.ADAPTIVE_THRESH_GAUSSIAN_C
   - 가우시안 분포에 따른 가중치의 합으로 결정
   - 선명도는 조금 떨어지지만 잡티가 적음
   - 조명이 불균일한 이미지나 디테일을 유지하고자 할 때 효과적

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./sudoku.jpg', cv2.IMREAD_GRAYSCALE)

th, dst1 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

#blockSize : 9*9를 의미함
#C(5) : 더 계산할 필요할게있다면 전체적으로 좀 더 조절해주는것
dst2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 5)

# 가우시안 C로 만든 dst3
dst3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 5)

# cv2.THRESH_OTSU ,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.ADAPTIVE_THRESH_GAUSSIAN_C의 값을 각각 딕셔너리로만들어서 비교해보기

dic = {'img': img, 'dst1': dst1, 'dst2': dst2, 'dst3': dst3}

for i, (k,v) in enumerate(dic.items()):
    plt.subplot(2,2, i+1)
    plt.title(k)
    plt.imshow(v, 'gray')
plt.show()

 

결과확인

자동이진화(dst1)를 하면 빛이 균등하지않아서 아래쪽은 하나도안보이게되어서 사실상 사용할 수없게 되고 

dst2(meanC)는 오츠보다는 훨씬 잘 보이지만 노이즈가 좀 생기는것을 확인할 수 있습니다.

dst3(가우시안)은 또렷하지만 뿌옇습니다 그러나, 잡음이 좀 덜하다는 차이가 있습니다.

이런 옵션을 확인해서 전처리를 확인할 수 있습니다.