open CV_8 이미지 형태찾기

chi yeong Yu·2022년 2월 28일
0

opencv

목록 보기
8/12
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('coin.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# cv2.thresh_otsu -> 임계값을 사용자가 정의를 했지만 임계값을 자동으로 계산해주는 함수
# cv2.thresh_binary_inv -> binary 함수 inverse
kernel = np.ones((3, 3), np.uint8)
noise_del = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel,iterations=2)
# cv2.morphologyEx -> 노이즈, hole을 제거 (cv2.Morph_open-> 노이즈 제거, iterations - 높을 수록 점점 얇아짐)

bg = cv2.dilate(noise_del, kernel, iterations=3)
#(bg = background)
#cv2.dilate -> 이미지를 팽창 시키는 방법 - 이미지에 글자가 커짐을 볼 수 있다.
#cv2.erosion -> 이미지를 흐릿하게 만듦, 흐릿한 경계부분을 배경으로 인식하는 방법

dist_transform = cv2.distanceTransform(noise_del, cv2.DIST_L2, 5)
# cv2.distanceTransform -> 거리변환 (물체에 뼈대를 찾기위해 외곽 경계에서 가장 먼 곳을 찾는 방법)
#
ret, fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)
fg = np.uint8(fg)

unknown = cv2.subtract(bg, fg)

ret, markers = cv2.connectedComponents(fg)
# 0은 배경 1은 물체 라고 라벨링을 해주는 함수 

markers = markers + 1
markers[unknown == 255] = 0

makers = cv2.watershed(img, markers)
# cv2.watershed -> 물이 차오르는 형태로 이미지의 값으로 높낮이를 줘서 형태를 알아내는 방법
img[markers == -1] = [0, 0, 255]

images = [gray, thresh, bg, dist_transform, fg, unknown, markers, img]
titles = ["Gray", 'Binary', 'BG', 'Distance', 'FG', 'Unknown', 'Markers', 'Result']

for i in range(len(images)):
    plt.subplot(2, 4, i+1), plt.imshow(images[i]), plt.title(titles[i]), plt.xticks([]), plt.yticks([])
    
plt.show()

profile
호기심천국

0개의 댓글