OpenCV-Python 이미지 경사도 와 Sobel 필터 구현

그림 경사도
이미지 경사도 는 이미지 변화 속 도 를 계산 합 니 다.이미지 의 가장자리 부분 에 있어 그 레이스 케 일 값 의 변화 가 비교적 크 고 경사도 값 도 비교적 크다.반면에 이미지 에서 비교적 부 드 러 운 부분 에 대해 그 레이스 케 일 값 의 변화 가 비교적 적 고 해당 하 는 경사도 값 도 비교적 작다.일반적인 상황 에서 이미지 의 경사도 계산 은 이미지 의 가장자리 정보 이다.
사실 경사도 는 도체 이지 만 이미지 경사도 는 보통 픽 셀 값 의 차 이 를 계산 하여 경사도 의 유사 치 를 얻 고 유사 도체 라 고 할 수 있다.이 도 수 는 미적분 으로 표시 할 수 있다.
미적분 에서 1 차원 함수 의 1 단계 미분 의 기본 정 의 는 다음 과 같다.
一阶微分
한편,그림 은 2 차원 함수 f(x,y)로 그 미분 은 당연히 편 미분 이다.그래서 다음 과 같다.
偏微分
그림 은 분 산 된 2 차원 함수 이기 때문에ϵ한 없 이 작 아 서 는 안 된다.우리 의 그림 은 픽 셀 에 따라 분 산 된 것 이 고 가장 작다.ϵ1 픽 셀 입 니 다.그래서 위의 이미지 미분 은 다음 과 같은 형식 으로 바 뀌 었 다(ϵ=1):
3
이것 은 각각 그림 이(x,y)점 에서 x 방향 과 y 방향 에 있 는 경사도 입 니 다.위의 표현 식 에서 알 수 있 듯 이 그림 의 경사도 는 2 개의 인접 픽 셀 간 의 차이 에 해당 합 니 다.
그렇다면 이 경사도(또는 그 레이스 케 일의 변화 율)는 어떻게 이미지 의 선명 도 를 강화 합 니까?
우 리 는 먼저 x 방향 을 고려 하여 특정한 픽 셀 을 선택 하고 그 픽 셀 값 이 100 이 라 고 가정 하 며 x 방향 을 따라 인접 한 픽 셀 은 각각 90,90,90 이 고 위의 계산 에 따라 그 x 방향 경사도 는 각각 10,0,0 이다.여기 서 는 변화 율 의 절대 치 만 취하 여 변화의 크기 를 나타 내 면 된다.
X
우 리 는 100 과 90 사이 의 밝기 차이 가 10 으로 뚜렷 하지 않다 는 것 을 보 았 다.한 무리의 90 의 연속 그 레이스 케 일과 함께 있 으 면 윤곽 이 반드시 모호 할 것 이다.우 리 는 인접 픽 셀 그 레이스 케 일 값 이 변화 하면 경사도 가 있 고 인접 픽 셀 그 레이스 케 일 값 이 변화 하지 않 으 면 경사도 가 0 이라는 것 을 알 게 되 었 다.만약 우리 가 경사도 값 을 대응 하 는 픽 셀 과 더 하면 그 레이스 케 일 값 은 변화 가 없고 픽 셀 값 은 변 하지 않 으 며 경사도 값 이 있 는 그 레이스 케 일 값 은 커진다.
5
우 리 는 덧 붙 인 새로운 이미 지 를 보 았 다.원래 의 이미지 픽 셀 점 100 과 90 의 밝 기 는 10 밖 에 차이 가 나 지 않 았 다.지금 은 110 과 90 이 고 밝기 의 차 이 는 20 이다.대비 도 는 분명히 강화 되 었 다.특히 이미지 에서 물체 의 윤곽 과 가장자리 가 배경 과 크게 차이 가 났 다.이것 이 바로 경사도 로 이미 지 를 강화 하 는 원리 이다.
위 에 서 는 x 방향 만 말 했 을 뿐 Y 방향 은 같다.그러면 x 방향 과 y 방향의 경사도 를 결합 시 킬 수 있 습 니까?물론 입 니 다.x 방향 과 y 방향의 경사도 는 다음 과 같은 식 으로 표시 할 수 있 습 니 다.
6
여 기 는 제곱 이 고 개방 적 이 며 계 산 량 이 비교적 많 기 때문에 보통 절대 치 로 제곱 평화 각 근 과 비슷 한 조작 으로 계 산 량 을 낮 춘 다.
7
원 리 를 이해 한 후에 우 리 는 OpenCV 가 어떤 경사도 여과 기 를 제공 하 는 지 알 아 보 겠 습 니 다.
OpenCV 에서 그것 은 우리 에 게 세 가지 서로 다른 경사도 여과 기 를 제공 하거나 고역 여과 기 를 제공 했다.즉,Sobel,Scharr,Laplacian 이다.퀄 컴 이 라 니 요?사실은 그림 이 흐릿 한 것 과 반대 이다.그림 이 모호 한 것 은 저주파 가 통과 하여 고주파 를 막 는 것 이다.그러면 소음 을 제거 하고 날 카 로 운 가장 자 리 를 부 드 럽 게 할 수 있다.고역 여과 기 는 고주파 가 통과 하고 저주파 가 막 히 며 가장자리 가 더욱 뚜렷 해 지고 이미 지 를 강화 할 수 있다.
소 벨 필터
Sobel 필 터 는 분 산 된 미분 산 자 로 이 산 자 는 고 스 평활 과 미분 구도 연산 을 결합 시 켰 다.이 계산 자 는 부분 적 인 차 이 를 이용 하여 가장 자 리 를 찾 아 얻 은 것 은 경사도 의 유사 치 를 계산한다.
구체 적 인 원 리 는 다음 과 같다.
Sobel 필터 와 원본 이미 지 를 볼 륨 으로 계산 하면 수평 방향의 픽 셀 값 변화 상황 을 계산 할 수 있 습 니 다.예 를 들 어 Sobel 필터 의 크기 가 3*3 일 때 수평 방향 편도선 의 계산 방식 은 다음 과 같다.
8
P5 수평 방향 편도선(경사도)을 계산 해 야 한다 면 공식 은 다음 과 같다.P5x=(P3-P1)+2*(P6-P4)+(P9-P7)P5 수직 방향 편도선(경사도)을 계산 해 야 한다 면 공식 은 다음 과 같다.P5y=(P7-P1)+2*(P8-P2)+(P9-P3)OpenCV 에서 cv2.Sobel()함 수 를 제공 하여 Sobel 필 터 를 실현 합 니 다.그 함 수 는 다음 과 같 습 니 다.

def Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None):
src:원본 이미지
ddepth:출력 이미지 의 깊이,자세 한 값 은 다음 표 와 같 습 니 다.
그림 깊이 입력
출력 이미지 깊이
cv2.CV_8U
-1/cv2.CV_16S/cv2.CV_32F/cv2/CV_64F
cv2.CV_16U/cv2.CV_16S
-1/cv2.CV_32F/cv2.CV_64F
cv2.CV_32F
-1/cv2.CV_32F/cv2.CV_64F
cv2.CV_64F
-1/cv2.CV_64F
dx:X 방향 을 나타 내 는 가이드 단계
dy:Y 방향 을 대표 하 는 가이드 단계
ksize:Sobel 핵 크기,이 값 이-1 일 경우 Sobel 필터 로 연산 합 니 다.
scale:가이드 수치 에 사용 되 는 크기 조정 인 자 를 계산 합 니 다.기본 값 은 1 이 며 크기 조정 이 없습니다.
dela:대상 그림 의 값 을 불 러 옵 니 다.이 값 은 선택 할 수 있 습 니 다.기본 값 은 0 입 니 다.
border Type:경계 스타일,앞 에 박문 이 상세 하 게 소개 되 어 있 습 니 다.여 기 는 군말 이 아 닙 니 다.
주의해 야 할 것 은 ddepth 인 자 를-1 로 설정 하면 처리 결과 가 원래 이미지 와 일치 하도록 하면 잘못된 결 과 를 얻 을 수 있 습 니 다.실제로 이렇게 하면 경사도 치가 마이너스 가 될 수 있다.8 비트 그림 을 처리 하면 지정 한 연산 결과 도 8 비트 그림 형식 임 을 의미 하 며 모든 음 수 는 자동 으로 0 으로 절단 되 어 정보 손실 이 발생 합 니 다.정보 손실 을 피하 기 위해 계산 할 때 더 높 은 데이터 형식 cv2.CV 를 사용 합 니 다.64F,절대 치 를 추출 하여 cv2.CV 로 비 추기8U 타 입.그래서 우 리 는 Sobel 필 터 를 사용 하여 자주 ddepth 를 cv2.CV 로 설정 합 니 다.64F。
계산 X 방향 경사도 문법 형식:

cv2.Sobel(src,ddepth,1,0)
Y 방향 경사도 계산 문법 형식:

cv2.Sobel(src,ddepth,0,1)
XY 방향 경사도 계산 문법 형식:

cv2.Sobel(src,ddepth,1,1)
계산 XY 중첩 경사도 문법 형식:

dx=cv2.Sobel(src,ddepth,1,0)
dy=cv2.Sobel(src,ddepth,0,1)
dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
음수 가 나타 날 수 있 기 때문에 우 리 는 다른 함 수 를 사용 하여 절대 치 를 취해 야 합 니 다.이 함 수 는 cv2.convertScaleAbs()입 니 다.그 완전한 정 의 는 다음 과 같 습 니 다.

def convertScaleAbs(src, dst=None, alpha=None, beta=None):
알파:조절 계수,선택 가능 값,기본 값 1
베타:밝기 조절,기본 값 0
다음은 Sobel 필 터 를 사용 하여 이미지 수평 방향의 가장자리 정 보 를 얻 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0)
result=cv2.convertScaleAbs(sobel_x)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
9
이 어 Sobel 필 터 를 사용 하여 이미지 수직 방향의 가장자리 정 보 를 얻 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1)#       
result=cv2.convertScaleAbs(sobel_y)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
10
이어서 우 리 는 XY 방향의 사다 리 를 계산 할 것 이다.코드 는 다음 과 같다.

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_xy=cv2.Sobel(img,cv2.CV_64F,1,1)#    1
result=cv2.convertScaleAbs(sobel_xy)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
11
마지막 으로 우 리 는 수평 수직 두 방향의 중첩 가장자리 정 보 를 계산 합 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0)
sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1)
abx_x=cv2.convertScaleAbs(sobel_x)
abx_y=cv2.convertScaleAbs(sobel_y)
result=cv2.addWeighted(sobel_x,0.5,sobel_y,0.5,0)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.

OpenCV-Python 의 이미지 경사도 와 Sobel 필터 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 OpenCV 이미지 경사도 와 Sobel 필터 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기