Jupyter Notebook을 통해 코드를 작성할 수 있는 환경을 만들었으니, 이제 OpenCV를 활용하여 이미지를 다뤄 볼 차례다.
우선 OpenCV를 활용하기 위해 아래 2개 패키지를 Import 해준다.
import cv2 # OpenCV 패키지
import numpy as np # OpenCV를 통해 이미지를 다룰 때 행렬, 수치 계산 등의 작업을 효율적으로 하기 위해 사용하는 패키지
print(cv2.__version__)
print(np.__version__)
4.6.0
1.22.4
정상적으로 수행되었다면 위와 같이 현재 import된 패키지의 버전이 나오게 된다.
정상적으로 Import가 되었다면, OpenCV를 활용하여 이미지를 띄우는 작업을 해본다.
src_color = cv2.imread(img_url) # 이미지 원본으로 읽기
src_gray = cv2.cvtColor(src_color.copy(), cv2.COLOR_BGR2GRAY) # 이미지 원본으로 읽은 후 그레이스케일로 변환
url 경로에 있는 이미지를 읽어와 src_color, src_gray에 저장하였다.
이제 다음은 화면에 띄우는 작업을 한다.
cv2.namedWindow('src_color', flags = cv2.WINDOW_FREERATIO) # 이미지를 띄울 윈도우 생성
cv2.resizeWindow('src_color', 800, 600) # 800*600 크기로 윈도우 크기 변경
cv2.imshow('src_color', src_color) # 생성한 윈도우에 이미지 그리기
cv2.imshow('src_gray', src_gray) # 생성한 윈도우에 이미지 그리기
cv2.waitKey(0) # 입력된 시간까지 대기, 0이나 음수인 경우 키보드 입력이 있을때까지 대기
cv2.destroyAllWindows() #생성된 모든 윈도우 제거
src_color 결과
src_gray 결과
기본적인 동작인 이미지를 띄우고, 색을 변경하는 작업을 해보았다.
이젠 과제 수행을 진행하기 위해 OpenCV를 통해 이미지 프로세싱을 진행해보려한다.
과제의 목적은 이미지 OCR이다. OCR의 인식율은 이미지의 상태에 따라 좌지우지되며, 당연하게도 깔끔한 이미지일 수록 성능이 좋아진다.
하지만 앞으로 처리할 이미지들이 해상도가 좋고, 경계가 뚜렷하다는 보장이 없다. 보다 나은 결과를 위해 이미지의 노이즈를 줄이고, 이진화를 통해 불필요한 부분을 제거하여 이미지를 알아보기 쉽게 만들어야 한다.
이미지 블러링이란 노이즈를 줄이거나 외부 영향을 최소화하는 데 사용한다.
이를 통해 이미지의 노이즈를 줄이고, 연산 작업시 성능을 향상시킬 수 있다.
다양한 blur 처리가 있지만, 가우시안 흐림 효과와 중간값 흐림 효과를 사용하여 이미지를 변경해 보았다.
cv2.GaussianBlur( src, ksize, sigmaX, sigmaY = None, borderType = None )
cv2.medianBlur( src, ksize ) # ksize는 홀수만 가능!
원본, 가우시안, 중간값 흐림효과의 결과

이미지에서 어느 지점을 기준으로 픽셀을 분류에서 제외해야 할 때, 특정 값을 기준으로 값이 높거나 낮은 필셀을 검정 혹은 흰색으로 변환한다.
이미지에 대해 이러한 연산을 수행하는 것이 이진화다.
# src 이미지를 임계값 형식(type)에 따라 특정 연산을 진행
# 임계값(thresh)보다 낮은 픽셀은 0 또는 원본값으로, 임계값보다 높은 픽셀은 최댓값(maxval)로 변경한다.
# cv2.threshold 는 return 값이 2개로 [1]로 가져와야 이미지를 가져올 수 있다.
img = cv2.threshold(src, thresh, maxval, type)[1]
cv2.threshold(src_gray, 120, 255, cv2.THRESH_BINARY)[1] 처리 결과
임계값의 형식(type)은 여러 개로 각각 적용 후 적당한 형식을 찾아보아야 한다.
| 속성 | 설명 |
|---|---|
| cv2.THRESH_BINARY | 임계값을 초과할 경우 maxval, 아닐경우 0 |
| cv2.THRESH_BINARY_INV | 임계값을 초과할 경우 0, 아닐경우 maxval |
| cv2.THRESH_TRUNC | 임계값을 초과할 경우 thresh, 아닐경우 변형 없음 |
| cv2.THRESH_TOZERO | 임계값을 초과할 경우 변형 없음, 아닐경우 0 |
| cv2.THRESH_TOZERO_INV | 임계값을 초과할 경우 0, 아닐경우 변형 없음 |
| cv2.THRESH_MASK | 검은색 이미지로 변경(마스크용) |
| cv2.THRESH_OTSU | 오츠 알고리즘 적용(단일 채널 이미지에만 적용 가능) |
| cv2.THRESH_TRIANGLE | 삼각형(Triangle) 알고리즘 적용(단일 채널 이미지에만 적용 가능) |
cv2.threshold(src_gray, 120, 255, cv2.THRESH_OTSU)[1] 처리 결과
thresh = cv2.threshold(src_gray, 120, 255, cv2.THRESH_OTSU|cv2.THRESH_TOZERO)[1] 처리 결과
적응형 이진화 알고리즘이 존재하는데, 이는 이미지에 따라 임계값이 스스로 다른 값을 할당할 수 있도록 구성된 이진화 알고리즘이다.
# threshold 함수와 동일한 maxval, type(thresholdType) 파라미터를 가진다.
# 각 픽셀 주변의 blockSize*blockSize 영역에 가중 평균을 계산, 이때 상수 C를 감산한 값을 수식에 적용
cv2.adpativeThreshold( src, maxval, adaptiveMethod, thresholdType, blockSize, C)
| 속성 | 설명 |
|---|---|
| cv2.ADAPTIVE_THRESH_MEAN_C | blockSize 영역의 모든 픽셀에 평균 가중치를 적용 |
| cv2.ADAPTIVE_THRESH_GAUSSIAN_C | blockSize 영역의 모든 픽셀에 중심점으로부터의 거리에 대한 가우시안 가중치를 적용 |
thresh = cv2.adaptiveThreshold(src_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 33, -1) 처리 결과
내용출처 : C#과 파이썬을 활용한 OpenCV 4 프로그래밍