코딩 및 기타/이미지

sobel 연산자

정지홍 2025. 1. 9. 13:40

각각 수평 커널 , 수직 커널
식1

 

sobel 연산자

  • 이미지에서 edge를 찾기 위해서 사용되는 필터이다.
  • 주로 이미지에서 밝기 변화가 급격하게 일어나는 부분을 감지해서 경계를 추출하는데 사용됨.
  • 과정
    • 1. 2차원 이미지에서 수평과 수직 방향으로 경계를 감지하기 위해서, 각각 수평과 수직의 sobel kernel을 적용한다.
    • 2. kernel을 사용해서 경계의 수평과 수직 변화를 계산한다.
      • kernel들은 convolution연산으로 수평 및 수직 변화량을 구함
    • 3.  수평,수직 변화량을 가지고 경계의 크기(강도)를 계산한다. ( 식1을 가지고...)
      • 경계의 크기(강도)란?
        • 두 인접한 영역의 밝기나 색상 값에 차이가 있을때를 말한다.
          • 뚜렷한 경우는 하얀색으로 표현 (255)
          • 경계가 희미하면 어두운색으로 표현 ( 0 )

 

 


 

import cv2
import numpy as np
import matplotlib.pyplot as plt

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

sobel_x = cv2.Sobel( img , cv2.CV_64F , 1 , 0 , ksize = 3 ) # 수평
sobel_y = cv2.Sobel( img , cv2.CV_64F , 0 , 1 , ksize = 3 ) # 수직

sobel_img = cv2.magnitude( sobel_x , sobel_y ) # 경계 강도 계산
  • cv2.Sobel( src , data_depth , dx , dy , ksuze , scale=1 , delta=0 , borderType = cv2.BORDER_DEFAULT )
    • src : 입력 이미지이다. 단, grayscale과 같은 단일채널이어야 함.
    • date_depth : 출릭 이미지의 깊이(데이터 타입)을 지정. 이 값에 따라서 연산 후 출력 이미지의 data_type이 결정됨.
      • cv2.CV_64F : 64비트의 부호가 있는 실수형 ( 더 정확함. 경계값에 부호가 존재할 수 있으니 np.uint8으로 변환 필요 할수도...)
      • cv2.CV_SU : 8비트의 부호가 없는 정수형( 일반적 이미지에서 사용 )
    • dx : 수평 방향의 미분 차수이다. 1이면 x방향으로 1차미분이며 0이면 미분을 안함.
    • dy : 수직 방향의 미분 차수. dy=1이면 y방향으로 1차 미분, dy=0이면 미분을 안함.
      • ex) dx=0 , dy=1이면 수직 경계를 가짐. dx=1 y=0이면 수평 경계
    • ksize : sobel kernel의 크기. 3이면 3x3크기의 커널 사용.
    • scale : 계산된 경계 값에 곱해질 비율이다. 이는 경계 강도의 크기를 조정하기 위해 사용
    • delta : 계산된 경계 값에 더해질 값이다. 이것도 경계 강도 조정
    • borderType : 이미지 경계를 처리하는 방법
      • cv2.BORDER_DEFAULT : 기본 경계 처리 방식
      • cv2.BORDER_REFLECT : 경계를 반사하는 방식
      • cv2.BORDER_REPLICATE : 경계 값을 복제하는 방식
  • cv2.magnitude( x , y )
    • 위의 식1을 계산하는 함수 

원본
다른 이미지
중간에 가우시안 필터를 한번 거친거