지역 이진화
균일하지 않은 조명 환경에서 찰영된 영상에서 사용할 수 있다.
불균일한 조명이 있는 영상에서는 이진화 결과가 지저분하게 나온다. 이를 해결하기 위해서는 지역 이진화 방법을 이용해야 한다.
위의 문제 해결하기
- 불균일한 조명 성분 보상 후 이진화 수행
- 픽셀 주변에 윈도우 설정하여 지역 이진화 수행
- 윈도우 크기
- 윈도우 형태 : Uniform? Gaussian?
- 윈도우 겹칠건가? Overlap? Non-overlap?
- 원도우 안에 배경 혹은 객체만 존재
import sys
import numpy as np
import cv2
# 입력 영상 불러오기
src = cv2.imread('rice.png', cv2.IMREAD_GRAYSCALE)
if src is None:
print('Image load failed!')
sys.exit()
# 전역 이진화 by Otsu's method
_, dst1 = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 지역 이진화 by Otsu's method
dst2 = np.zeros(src.shape, np.uint8)
bw = src.shape[1] // 4
bh = src.shape[0] // 4
for y in range(4):
for x in range(4):
src_ = src[y*bh:(y+1)*bh, x*bw:(x+1)*bw]
dst_ = dst2[y*bh:(y+1)*bh, x*bw:(x+1)*bw]
cv2.threshold(src_, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU, dst_)
# 결과 출력
cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()
✔︎ OpenCV 적응형 이진화 - cv2.adaptiveThreshold
cv2.adaptiveThreshold는 OpenCV에서 제공하는 적응형 이진화 함수이다.
가우시안 블러를 적용하여 노이즈를 제거한 뒤에 Otsu 이진화를 적용한다.
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
- src : 입력 영상. 그레이스케일 영상.
- maxValue : 임계값 함수 최댓값. 보통 255.
- adaptiveMethod : 블록 평균 계산 방법 지정.
cv2.ADAPTIVE_THRESH_MEAN_C는 산술평균, cv2.ADAPTIVE_THRESH_GAUSSIAN_C는 가우시안 가중치 평균 - thresholdType : cv2.THRESH_BINARY 또는 cv2.THRESH_BINARY_INV 지정
- blockSize : 블록 크기. 3 이상의 홀수.
- C : 블록 내 평균값 또는 블록 내 가중 평균값에서 뺄 값.
(x, y) 픽셀의 임계값으로 $T(x,y) = \mu_{B}(x,y) - C$ 를 사용
blocksize는 크게 줘야 하며, 작게 주면 결과가 좋지 않다. 또한 3 이상의 홀수를 입력해야 하며 경우에 따라 51 X 51을 이용할 때도 있다.
C는 임계값을 결정하는 파라미터이다.
💬 적응형 이진화 예제
import sys
import numpy as np
import cv2
src = cv2.imread('sudoku.jpg', cv2.IMREAD_GRAYSCALE)
if src is None:
print('Image load failed!')
sys.exit()
def on_trackbar(pos):
bsize = pos
if bsize % 2 == 0:
bsize = bsize - 1
if bsize < 3:
bsize = 3
dst = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, bsize, 5)
cv2.imshow('dst', dst)
cv2.imshow('src', src)
cv2.namedWindow('dst')
cv2.createTrackbar('Block Size', 'dst', 0, 200, on_trackbar)
cv2.setTrackbarPos('Block Size', 'dst', 11)
cv2.waitKey()
cv2.destroyAllWindows()
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 이진 영상 처리 : 모폴로지(Morphology) - 열기와 닫기 (0) | 2022.02.04 |
---|---|
[OpenCV with Python] 이진 영상 처리 : 모폴로지(Morphology) - 침식과 팽창 (0) | 2022.02.04 |
[OpenCV with Python] 이진 영상 처리 : 자동 이진화 - Otsu 방법 (0) | 2022.02.04 |
[OpenCV with Python] 이진 영상 처리 : 영상의 이진화 - cv2.threshold (0) | 2022.02.04 |
[OpenCV with Python] 영상의 특징 추출 : 영상에서 원 검출하기 - 허프 변환 (0) | 2022.02.04 |