색깔이 중요하지 않고 테두리와 형태가 중요한 이미지가 있으면, 유색 이미지를 무채색으로 바꾸어야 할때가 있다.
이진화는 이미지를 흑백값만 가지게끔 변환한다. 숫자는 0아니면 255만을 가지게 된다.
이미지의 색조를 불러와서 회색조로 바꾸는 방법이 있다.
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
img = cv2.imread('C:/Users/Owner/Desktop/Computer-Vision-with-Python/Computer-Vision-with-Python/DATA/rainbow.jpg',0)
plt.imshow(img)
필요한 모듈 임포트해주고 사진을 불러와줌. 매개변수를 0으로 넣어줌
plt.imshow(img,cmap='gray')
회색 색깔 맵핑하여 회색조로 바꿔준다
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
이미지에 대한 임계값을 설정하기 위해 이미지, 실제 임계값, 최대 예상값, 이진화 유형을 설정해준다,
기본적으로 maxval은 실제 임계값보다 낮은 값은 0으로 변환하고, 그보다 높은것은 최대값으로 변환한다.
이진화를 할때 대부분 중간점을 임계값으로 정하기 떄문에 255의 중간점을 실제 임계값으로 설정해줌.
이미지의 최대 예상값은 img.max()로 구할 수 있지만 255도 가능함
즉, 말해서 127보다 낮은값은 0, 큰값은 255로 바뀜
ret
127.0
실제 임계값은 127이 나옴
plt.imshow(thresh1,cmap='gray')
이렇게 이진 이미지가 나온다.
위의 임계치 설정에서 THRESH_BINARY_INV를 입력하면 이미지가 반전된다. 원래값이 임계값보다 크면 0으로, 작으면 최대값으로 변한다.
THRESH_TRUNC는 원래값이 임계값보다 크면, 사용자가 설정한 값으로 변함, 원래값이 임계치보다 작으면 그대로 유지됨
또다른 이미지를 예시로 들어보자
img = cv2.imread('C:/Users/Owner/Desktop/Computer-Vision-with-Python/Computer-Vision-with-Python/DATA/crossword.jpg',0)
plt.imshow(img,cmap='gray')
회색조로 불러와야하니까 0으로 넣고 회색으로 맵핑해준다.
def show_pic(img):
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(111)
ax.imshow(img,cmap='gray')
show_pic(img)
이미지를 좀 더 키울 수 있는 함수를 만들어서 이미지를 키워준다.
잉크가 있는 부분은 더 까맣게 나오고, 없는 곳은 더 하얗게 나오기 위해 임계치를 조정한다.
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
show_pic(th1)
임계값과 최대가능값을 넣어 이미지를 불러온다
회색이었던 부분이 하얗게 변해서 품질이 떨어진다.
품질을 좀 더 향상시킬 수 있는 방법은 이진화 유형을 바꿔보거나, 임계치를 조절해보는 것이다.
th2= cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,8)
show_pic(th2)
적응형 이진화는 임계값을 자동으로 픽셀과 주변 회색 픽셀에 기반해서 조정함
이미지, 최대값, 적응형 이진화 방법으로 평균, 이진화 유형 THRESH_BINARY를 넣어준다
마지막 매개변수 두개는 블록 규모와 constant 값이다
블록 규모는 픽셀 주변부의 규모로 특정 픽셀의 임계값을 계산하는데 사용됨. 대부분 홀수 3,5,7,11 등을 시도함
constant 값은 양수로 많이 하지만 0이나 음수도 괜찮음
blended = cv2.addWeighted(src1= th1, alpha=0.6, src2= th2,beta=0.4,gamma=0)
show_pic(blended)
마지막으로 임계치를 조절하는 방법이다 앞서 배운 이진화 방법의 이미지와 적응형 이진화 방법의 이미지를 섞어서 복합된 이미지를 만들 수 있음. src1이 60%, src2는 40% 반영되게 하고 감마를 0으로 넣어 이미지를 합친다.
그러면 조금 더 나아보이는듯..?
출처: udemy X KMOOC OpenCV 및 딥러닝을 이용한 Computer Vision 파이썬
'Deep Learning > Computer Vision' 카테고리의 다른 글
Gradients (0) | 2023.07.16 |
---|---|
Image Blurring & Smoothing (0) | 2023.07.16 |
파이썬 마우스로 이미지에 직접 그리기 (0) | 2023.07.09 |
파이썬 이미지에 도형 그리기 (0) | 2023.07.09 |
Image and Numpy (0) | 2023.07.08 |