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를 불러서 사용하면 됩니다.
'AI 컴퓨터 비전프로젝트' 카테고리의 다른 글
[DL] 적응형이진화(cv2.adaptiveThreshold())+자동이진화 적응형, 가우시안 비교 (0) | 2024.10.04 |
---|---|
[DL] 오츠의 이진화(스레숄드값을 자동으로 잡아주기) (0) | 2024.10.03 |
[DL] 마스크 연산_cv2.copyTo(), 동영상 합성 (0) | 2024.10.01 |
[DL] cv2.inRange_hsv 색상추출 (0) | 2024.09.30 |
[DL] 정규화 (0) | 2024.09.29 |