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

[DL]영상의 이진화(Binarization)

by 바다의 공간 2024. 10. 2.
2. 영상의 이진화(Binarization)
- 픽셀을 검은색 또는 흰색과 같이 두 분류의 값으로 나누는 작업
- 영상에서 의미있는 관심 영역(ROI)과 비관심 영역으로 구분할 때 사용
- 예) 배경과 객체를 둘로 나눌 때
- 영상의 이진화 연산을 할 때 나누는 특정값을 임계값이라고 함
- cv2.threshold(영상, 임계값, 최대값, 플래그)
    플래그
    cv2.THRESH_BINARY: 픽셀값이 임계값을 넘으면 최대값으로 지정하고 넘지 못하면 0으로 지정
    예) 픽셀값 150, 임계값 120: 픽셀값은 255로 설정
    cv2.THRESH_BINARY_INV: cv2.THRESH_BINARY의 반대

이번에는 영상의 이진화를 해보는 작업을 하려고 합니다.

사용할 사진은 아래와 같습니다.

## binarization

 

2. 영상의 이진화(Binarization)
- 픽셀을 검은색 또는 흰색과 같이 두 분류의 값으로 나누는 작업
- 영상에서 의미있는 관심 영역(ROI)과 비관심 영역으로 구분할 때 사용
- 예) 배경과 객체를 둘로 나눌 때
- 영상의 이진화 연산을 할 때 나누는 특정값을 임계값이라고 함
- cv2.threshold(영상, 임계값, 최대값, 플래그)
    플래그
    cv2.THRESH_BINARY: 픽셀값이 임계값을 넘으면 최대값으로 지정하고 넘지 못하면 0으로 지정
    예) 픽셀값 150, 임계값 120: 픽셀값은 255로 설정
    cv2.THRESH_BINARY_INV: cv2.THRESH_BINARY의 반대

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./cells.png', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [256], [0, 255])

# a: thresh, 100
a, dst1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
# b: thresh, 210
b, dst2 = cv2.threshold(img, 210, 255, cv2.THRESH_BINARY)

cv2.imshow('img', img)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)

plt.plot(hist)
plt.show()
cv2.waitKey()
img = cv2.imread('./cells.png',cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [25],[0, 255])

# a: thresh, 100
a, dst1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
# b: thresh, 210
b, dst2 = cv2.threshold(img, 210, 255, cv2.THRESH_BINARY)

cv2.imshow

 

calcHist 함수는 함수 안에 [img], [채널], 마스크: none,histSize, ranges값을 넣게됩니다.

 

다음은 

앞에 변수를 a, dist1이라고 하고 threshold를 넣습니다(img, 100, 255, cv2.THRESH_BINARY) = 100이라는 밝기값을 기준으로 둘로 나누겠다는 의미, 255 : 최대값,  cv2.Thresh_binary을 줍니다.

DST2값도 살짝 다르게 줍니다.

여기서 보면 히스토그램으로 볼 수 있는데 dst1같은 경우에는 임계값(thresh)이 100보다 큰 픽셀들은 255로 해버리고 

작은애들은 0으로 합니다. 

이진화가 쓰레숄드로 인해서 2개로 나누어진 것입니다. 

특정 밝기기준으로 나뉘어질 수 있습니다. 예를들어서 까망부분이 몸에 안좋은거다~ 라고 하면 이런부분을

확인할 수 있습니다. 

물체를 찾때 좋을 수 있겠죠.

 

이진화를 하면 내가 원하는 스레숄드값에 의해서 값들이 달라질 수있습니다.


여기서 threshold는 각 th,dst이렇게 두는 이유가 궁금했는데
ex) _, dst = cv2.threshold(img,100,255, cv2.THRESH_BINARY)
thresolhd가 받는 값이 2개라서 무조건 2개를 좌변에 넣어주어야합니다.
표준적인 것임으로 무조건 그렇게 해야하고 안 쓴다면 오류가 날 가능성이 굉장히 크다고 합니다.
그래서 만약 threshold값을 안 받고싶다면 _ 로 작성해 주면 됩니다.

결국 하는 역할은 100을 앞자리 a(위코드 중 _) 에 쓰레숄드값을 넣어주고
이진화처리가 된 이미지를 dst변수에 넣어주게 됩니다.
그 후 이진화된 이미지가 필요하다면 dst를 불러서 사용하면 됩니다.