AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • 프로그래머스
  • Python
  • 알고리즘
  • 파이썬
  • 이코테
  • LEVEL2
  • 연습문제
  • OpenCV
  • 백준
  • level1

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

[OpenCV with Python] 이진 영상 처리 : 지역 이진화 - cv2.adaptiveThreshold
OpenCV

[OpenCV with Python] 이진 영상 처리 : 지역 이진화 - cv2.adaptiveThreshold

2022. 2. 4. 17:50

지역 이진화

균일하지 않은 조명 환경에서 찰영된 영상에서 사용할 수 있다.

 

 

불균일한 조명이 있는 영상에서는 이진화 결과가 지저분하게 나온다. 이를 해결하기 위해서는 지역 이진화 방법을 이용해야 한다.

 

 

위의 문제 해결하기

  1. 불균일한 조명 성분 보상 후 이진화 수행
  2. 픽셀 주변에 윈도우 설정하여 지역 이진화 수행
    • 윈도우 크기
    • 윈도우 형태 : 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
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바