이미지 임계처리에는 simple thresholding, adaptive thresholding, Otsu's thresholding가 있다.
opencv에서는 cv2.threshold(), cv2.adaptiveThreshold()를 이용하면된다. 간-단
기본 임계처리
- 이진화 처리: 흑/백으로 분류하여 처리하는 것
기준이되는 임계값을 정하는 것이 중요하다. 임계값 보다 크면 백, 작으면 흑이 된다.
cv2.threshold(src, thresh, maxval, type) → retval, dst
- src – input image(grayscale 이미지)
- thresh – 임계값
- maxval – 임계값을 넘었을 때 적용할 value
- type – thresholding type
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | img = cv2.imread('pic/image1.jpeg', 0) ret, thresh1 = cv2.threshold(img,127,255, cv2.THRESH_BINARY) ret, thresh2 = cv2.threshold(img,127,255, cv2.THRESH_BINARY_INV) ret, thresh3 = cv2.threshold(img,127,255, cv2.THRESH_TRUNC) ret, thresh4 = cv2.threshold(img,127,255, cv2.THRESH_TOZERO) ret, thresh5 = cv2.threshold(img,127,255, cv2.THRESH_TOZERO_INV) titles =['Original','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] images = [img,thresh1,thresh2,thresh3,thresh4,thresh5] for i in range(6): plt.subplot(2,3,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() | cs |
다음은 각 임계값을 어떻게 정하느냐에 따라 어떻게 달라지는지 한번 해봤다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ret, thresh1 = cv2.threshold(img, 25,255, cv2.THRESH_BINARY) ret, thresh2 = cv2.threshold(img, 50,255, cv2.THRESH_BINARY) ret, thresh3 = cv2.threshold(img, 100,255, cv2.THRESH_BINARY) ret, thresh4 = cv2.threshold(img, 150,255, cv2.THRESH_BINARY) ret, thresh5 = cv2.threshold(img, 175,255, cv2.THRESH_BINARY) ret, thresh6 = cv2.threshold(img, 200,255, cv2.THRESH_BINARY) ret, thresh7 = cv2.threshold(img, 250,255, cv2.THRESH_BINARY) titles =['25', '50', '100', '150', '175', '200', '250'] images = [thresh1,thresh2,thresh3,thresh4,thresh5, thresh6, thresh7] for i in range(7): plt.subplot(2,4,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() | cs |
이처럼, 임계값을 이미지 전체에 적용하여 처리하기 때문에 하나의 이미지에 음영이 다르면 전부 흰색, 전부 검은색으로 나타나게 된다.
이를 해결하기 위해서 작은 영역 별로 thresholding을 할수 있다.
cv2.adaptiveTresholod()를 사용 하면된다.
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
src – grayscale image
maxValue – 임계값
adaptiveMethod – thresholding value를 결정하는 계산 방법
cv2.ADAPTIVE_THRESH_MEAN_C : 주변영역의 평균값으로 결정
cv2.ADAPTIVE_THRESH_GAUSSIAN_C :
thresholdType – threshold type
blockSize – thresholding을 적용할 영역 사이즈
C – 평균이나 가중평균에서 차감할 값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | img = cv2.imread('pic/image1.jpeg', 0) # print(img.shape) 699,699 ret, th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) th2 = cv2.adaptiveThreshold(img, 100,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,15,10) th3 = cv2.adaptiveThreshold(img, 255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,10) titles = ['Original','Global','Mean','Gaussian'] images = [img,th1,th2,th3] for i in range(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() | cs |
음, 사진 자체 예시가 별로라 잘 모르겠지만......으으으으응
'Project > 데이터 가지고 놀기' 카테고리의 다른 글
[Seoul Store] 내맘대로 하는 서울상가 데이터 탐색기 (1) (0) | 2018.07.14 |
---|---|
[서울시 도서관] 서울시 도서관 개수 시각화 (0) | 2018.07.11 |
pixel-art :: openCV 기초 (3) - 이미지 연산 (0) | 2018.03.06 |
pixel-art :: openCV 기초 (2) - pixel 접근 및 이미지 복사 (0) | 2018.02.08 |
picel-art :: openCV 기초 (1) - 이미지를 불러오자 (0) | 2018.02.08 |
댓글