그라디언트는 엣지 검출, 객체검출, 이미지 분류와 같은 작업에 유용하고, 컬러나 강도의 변경을 나타낸다.
특정 방향에서 계산될 수 있어서 방향에 따라 계산이 달리되어 이미지가 다르게 나타남
소벨 연산자에서 사용하는 수학 공식을 보면 3*3커널 2개를 사용한다
이커널이 이미지에 적용되어서 도함수의 근사값을 계산하는데 하는 수평변화, 하나는 수직변화값을 계산함
https://en.wikipedia.org/wiki/Sobel_operator
Sobel operator - Wikipedia
From Wikipedia, the free encyclopedia Image edge detection algorithm A color picture of an engine The Sobel operator applied to that image The Sobel operator, sometimes called the Sobel–Feldman operator or Sobel filter, is used in image processing and co
en.wikipedia.org
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
img = cv2.imread('../DATA/sudoku.jpg',0)
스도쿠 이미지를 불러온다
def display_img(img):
fig = plt.figure(figsize=(12,10))
ax = fig.add_subplot(111)
ax.imshow(img,cmap='gray')
display_img(img)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
소벨 연산자에 이미지와 원하는 depth(픽셀의 정확성)를 입력해준다 24:8, 32:64d와 같은 것을 연상하면 된다.
64F는 64float point정확성을 의미한다. 다음두변수는 x방향, y방향을 의미하고 커널 사이즈를 정의해준다
라플라시안 연산자는 x방향, y방향 모두 사용해준다.
display_img(sobelx)
그래디언트의 수직라인 위치는 확인하기 용이하지만 수평라인은 확인이 어렵다
display_img(sobely)
수평라인이 눈에띄게 나온다
display_img(laplacian)
라플라시안은 그라디언트의 관계가 주어지면 이미지의 라플라시안을 계산함
엣지 검출을 시도한 것처럼 보인다. x,y에 그라디언트를 사용해 노이즈를 제거하여 엣지부분 그라디언트는 선명히 보임
blended = cv2.addWeighted(src1=sobelx,alpha=0.5,src2=sobely,beta=0.5,gamma=0)
display_img(blended)
sobel x와 sobel y를 블렌딩하여 수평, 수직라인이 뚜렷하게 나오게 한다 반반씩 베타값을 설정함
kernel = np.ones((4,4),np.uint8)#정수사용해야 버그 안생김
gradient = cv2.morphologyEx(blended,cv2.MORPH_GRADIENT,kernel)
display_img(gradient)
커널을 4*4로 0으로 가득채우고, morphology operator를 사용하여 앞서 만든 blended와 커널을 이용하여 그라디언트를 다시 계산해본다. 흑백으로 꽤나 뚜렷한 결과가 나온다. 숫자는 흐릿하지만 하얀색을 명확하게 볼 수 있다
ret,th1 = cv2.threshold(img,100,255,cv2.THRESH_BINARY)
display_img(th1)
이진 임계치를 적용할 수 있다. 엣지를 잘 검출 했지만 안의 그리드 라인은 검출하지 못했다
ret,th1 = cv2.threshold(gradient,200,255,cv2.THRESH_BINARY_INV)
display_img(th1)
이전 morphologyEX로 구한 것을 이미지로 넣어서 binary_inv로 해주면 안의 그리드가 뚜렷하게 나온다
ret,th1 = cv2.threshold(blended,100,255,cv2.THRESH_BINARY_INV)
display_img(th1)
앞서 sobel x, sobel y로 블렌딩한 이미지를 넣으면 엣지뿐아니라 그리드까지 뚜렷하게 나오는 것을 알 수 있다
출처: udemy X KMOOC OpenCV 및 딥러닝을 이용한 Computer Vision 파이썬
'Deep Learning > Computer Vision' 카테고리의 다른 글
파이썬으로 카메라 연결하기 (2) | 2023.07.23 |
---|---|
Histograms with OpenCV (1) | 2023.07.16 |
Image Blurring & Smoothing (0) | 2023.07.16 |
Image Binary (0) | 2023.07.16 |
파이썬 마우스로 이미지에 직접 그리기 (0) | 2023.07.09 |