Skip to content

Latest commit

 

History

History
199 lines (150 loc) · 6.18 KB

220127.md

File metadata and controls

199 lines (150 loc) · 6.18 KB

Day 107

OpenCV(Computer Vision)

13. 이미지 변형 (이진화)

흰색과 검은색만 가지는 이미지로 변형시키는 것을 말한다.

import cv2
img = cv2.imread('book.jpg', cv2.IMREAD_GRAYSCALE)

ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.imshow('img', img)
cv2.imshow('binary', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

색 값이 127을 넘으면 흰색으로 처리한다.

threshold_127

Trackbar (값 변화에 따른 변형 확인)

import cv2

def empty(pos):
    pass

img = cv2.imread('book.jpg', cv2.IMREAD_GRAYSCALE)

name = 'Trackbar'
cv2.namedWindow(name)

cv2.createTrackbar('threshold', name, 127, 255, empty) # (bar 이름, 윈도우 이름, 초기값, 최대값, 이벤트 처리)

while True:
    thresh = cv2.getTrackbarPos('threshold', name) # (bar 이름, 윈도우 이름)
    ret, binary = cv2.threshold(img, thresh, 255, cv2.THRESH_BINARY)
    
    if not ret:
        break
        
    cv2.imshow(name, binary)
    if cv2.waitKey(1) == ord('q'):
        break
        
cv2.destroyAllWindows()

윈도우 상단의 바를 움직이면 그에 따라 thresh 값이 변경되어 값 변화에 따른 이미지의 변화를 실시간으로 확인할 수 있다.

trackbar

임계점을 넘으면 흰색으로 처리하는 것이다. 예를 들어 127인 회색이 있다면 임계치가 126이면 검은색, 127이면 흰색으로 처리하는 것이다.

Adaptive Threshold

이미지를 작은 영역으로 나누어서 임계치를 적용한다.

import cv2

def empty(pos):
    pass

img = cv2.imread('book.jpg', cv2.IMREAD_GRAYSCALE)

name = 'Trackbar'
cv2.namedWindow(name)

# (bar 이름, 윈도우 이름, 초기값, 최대값, 이벤트 처리)
cv2.createTrackbar('block_size', name, 25, 100, empty) # block size는 홀수만 가능, 1보다는 큰 값
cv2.createTrackbar('c', name, 3, 10, empty) # 일반적으로 양수의 값을 사용

while True:
    block_size = cv2.getTrackbarPos('block_size', name) # (bar 이름, 윈도우 이름)
    c = cv2.getTrackbarPos('c', name)
    
    if block_size <= 1: # 1 이하면 3으로
        block_size = 3
        
    if block_size % 2 == 0: # 짝수이면 홀수로
        block_size += 1
    
    binary = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block_size, c)
        
    cv2.imshow(name, binary)
    if cv2.waitKey(1) == ord('q'):
        break
        
cv2.destroyAllWindows()

adaptiveThreshold의 두 번째 인수인 255는 임계치를 넘었을 때 최대값으로 처리할 값을 말한다. 위에서는 임계치를 넘으면 흰색으로 처리하도록 된 것이다.

adaptive_threshold

오츠 알고리즘

Bimodal Image에 사용하기 적합 (최적의 임계치를 자동으로 발견)

import cv2
img = cv2.imread('book.jpg', cv2.IMREAD_GRAYSCALE)

ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, otsu = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

cv2.imshow('img', img)
cv2.imshow('binary', binary)
cv2.imshow('otsu', otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()

book 이미지는 오츠 알고리즘을 사용하기에 적합하지 않은 이미지이기 때문에 좋은 결과는 나오지 않았다.

otsu

14. 이미지 변환 (팽창)

이미지를 확장하여 작은 구멍을 채움

흰색 영역의 외곽 픽셀 주변에 흰색을 추가

import cv2
import numpy as np

kernel = np.ones((3, 3), dtype=np.uint8)

img = cv2.imread('dilate.png', cv2.IMREAD_GRAYSCALE)
dilate1 = cv2.dilate(img, kernel, iterations=1) # (이미지, 커널, 반복 횟수)
dilate2 = cv2.dilate(img, kernel, iterations=2)
dilate3 = cv2.dilate(img, kernel, iterations=3)

cv2.imshow('gray', img)
cv2.imshow('dilate1', dilate1)
cv2.imshow('dilate2', dilate2)
cv2.imshow('dilate3', dilate3)
cv2.waitKey(0)
cv2.destroyAllWindows()

dilation

15. 이미지 변환 (침식)

이미지를 깎아서 노이즈 제거

흰색 영역의 외곽 픽셀을 검은색으로 변경

import cv2
import numpy as np

kernel = np.ones((3, 3), dtype=np.uint8)

img = cv2.imread('erode.png', cv2.IMREAD_GRAYSCALE)
erode1 = cv2.erode(img, kernel, iterations=1)
erode2 = cv2.erode(img, kernel, iterations=2)
erode3 = cv2.erode(img, kernel, iterations=3)

cv2.imshow('gray', img)
cv2.imshow('erode1', erode1)
cv2.imshow('erode2', erode2)
cv2.imshow('erode3', erode3)
cv2.waitKey(0)
cv2.destroyAllWindows()

erode

16. 이미지 변환 (열림 & 닫힘)

열림 (Opening) : 침식 후 팽창. 깎아서 노이즈 제거후 팽창 시킴

dilate(erode(image))

import cv2
import numpy as np

kernel = np.ones((3, 3), dtype=np.uint8)
img = cv2.imread('erode.png', cv2.IMREAD_GRAYSCALE)

erode = cv2.erode(img, kernel, iterations=3)
dilate = cv2.dilate(erode, kernel, iterations=3)

cv2.imshow('img', img)
cv2.imshow('erode', erode)
cv2.imshow('dilate', dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

Opening

닫힘 (Closing) : 팽창 후 침식. 구멍을 메운 후 다시 깎음

erode(dilate(image))

import cv2
import numpy as np

kernel = np.ones((3, 3), dtype=np.uint8)
img = cv2.imread('dilate.png', cv2.IMREAD_GRAYSCALE)

dilate = cv2.dilate(img, kernel, iterations=3)
erode = cv2.erode(dilate, kernel, iterations=3)

cv2.imshow('img', img)
cv2.imshow('dilate', dilate)
cv2.imshow('erode', erode)

cv2.waitKey(0)
cv2.destroyAllWindows()

closing