MATLAB에서 이미지 가장자리 감지에 Sobel 연산자 사용
MATLAB에서 가장자리 감지 이미지 처리의 Sobel
방법을 사용하는 다양한 방법을 살펴보겠습니다. 다양한 예제 코드와 관련 출력을 사용하여 개념을 명확하게 하고 MATLAB에서 가장자리 감지 이미지 처리 기술의 Sobel
방법에 대한 완전한 통찰력을 제공합니다.
가장자리 감지는 이미지 강도가 갑자기 변하거나 정확히는 불연속성을 포함하는 컴퓨터화된 그림에서 경계와 윤곽을 찾기 위한 다양한 분석적 접근 방식을 포함합니다.
단계 감지는 1차원 신호의 불연속성을 식별하고 변화 감지는 신호 불규칙성을 식별합니다.
가장자리 감지는 시각적 분석, 머신 비전 및 개체 인식, 특히 개체 인식 및 분리에서 강력한 기술입니다. Sobel, Canny, Prewitt, Roberts 및 Fuzzy 논리 접근 방식은 탁월한 에지 감지 기술입니다.
MATLAB에서 이미지 가장자리 감지를 위해 처음부터 Sobel
연산자 사용
Sobel–Feldman
연산자 또는 Sobel
필터라고도 하는 Sobel
연산자는 사진 및 비디오 처리, 특히 가장자리 감지 기술에서 사용할 수 있습니다. 가장자리를 강조하는 이미지를 생성합니다.
Stanford Artificial Intelligence Laboratory 협력자인 Irwin Sobel과 Gary Feldman(SAIL)의 이름을 따서 명명되었습니다. 1968년에 Sobel & Feldman은 SAIL에서 Isotropic 3x3 Image Gradient Operator의 개념을 소개했습니다.
불연속 미분 연산자는 사진 강도 곡선의 대략적인 기울기를 계산합니다. Sobel–Feldman
작업은 사진의 모든 위치에서 일치하는 그래디언트 벡터 또는 이 벡터의 법선을 생성합니다.
Sobel–Feldman
연산자는 작고 분리 가능한 정수 값 필터를 사용하여 가로 및 세로 방향으로 그림을 컨볼루션하는 데 기반을 두므로 계산 비용이 저렴합니다. 그러나 생성된 그래디언트 근사는 특히 그림의 고주파수 변동에 대해 매우 좋지 않습니다.
다음 예제를 통해 이 개념을 이해해 봅시다.
예제 코드:
Aimage=imread('peppers.png');
imshow(Aimage)
Bimage=rgb2gray(Aimage);
Cimage=double(Bimage);
for k=1:size(Cimage,1)-2
for l=1:size(Cimage,2)-2
%Sobel mask for x-direction:
G_x=((2*Cimage(k+2,l+1)+Cimage(k+2,l)+Cimage(k+2,l+2))-(2*Cimage(k,l+1)+Cimage(k,l)+Cimage(k,l+2)));
%Sobel mask for y-direction:
G_y=((2*Cimage(k+1,l+2)+Cimage(k,l+2)+Cimage(k+2,l+2))-(2*Cimage(k+1,l)+Cimage(k,l)+Cimage(k+2,l)));
%The gradient of the image
%B(i,j)=abs(Gx)+abs(Gy);
Bimage(k,l)=sqrt(G_x.^2+G_y.^2);
end
end
figure,
imshow(Bimage);
title('Sobel gradient Image');
출력:
가장자리 감지 이미지는 컷오프/임계값 설정을 활용하여 Sobel
기울기에서 얻을 수 있습니다. 대신 Sobel
기울기 비율이 기준 수준보다 작은 경우 임계값 수준이 적용됩니다.
f
가 위험 임계값과 같으면 f
는 미리 정의된 컷오프와 같습니다.
예제 코드:
Aimage=imread('peppers.png');
imshow(Aimage)
Bimage=rgb2gray(Aimage);
Cimage=double(Bimage);
for k=1:size(Cimage,1)-2
for l=1:size(Cimage,2)-2
%Sobel mask for x-direction:
G_x=((2*Cimage(k+2,l+1)+Cimage(k+2,l)+Cimage(k+2,l+2))-(2*Cimage(k,l+1)+Cimage(k,l)+Cimage(k,l+2)));
%Sobel mask for y-direction:
G_y=((2*Cimage(k+1,l+2)+Cimage(k,l+2)+Cimage(k+2,l+2))-(2*Cimage(k+1,l)+Cimage(k,l)+Cimage(k+2,l)));
%The gradient of the image
%B(i,j)=abs(Gx)+abs(Gy);
Bimage(k,l)=sqrt(G_x.^2+G_y.^2);
end
end
figure,
imshow(Bimage);
title('Sobel gradient Image');
%Define a threshold value
Thresholdd=100;
Bimage=max(Bimage,Thresholdd);
Bimage(Bimage==round(Thresholdd))=0;
Bimage=uint8(Bimage);
figure,
imshow(Bimage);
title('Edge detected Image');
여기에서 i=1:size (C,1) -2
및 j=1:size (C,2) -2
에서 2를 뺀 이유에 대한 질문이 발생합니다. 모든 (i,j)th
위치에서 3x3 프레임이 생성되기 때문입니다.
2를 제거하면 숫자를 경계 안에 유지할 수 있습니다. 이 경계는 소스 그림 행렬에서 요소 C(i,j)
를 보고 있다고 가정하고 Sobel
3x3 수평 마스크와 이미지 행렬의 컨볼루션 결과입니다.
Gx
행렬 Gx(i,j)
에서 해당 구성 요소를 얻으려면 C(i,j)
및 C(i,j)
요소 주변의 8개 이웃을 선택하고 각각을 곱합니다. 이를 Sobel
마스크의 해당 요소로 지정하고 결과를 추가합니다. C(i-1,j-1) * S(1,1)+C(i-1,j) * S(1,2) * C(i-1,j+1) * S(1,3)+..
(여기서는 9 곱셈).
출력:
Mehak is an electrical engineer, a technical content writer, a team collaborator and a digital marketing enthusiast. She loves sketching and playing table tennis. Nature is what attracts her the most.
LinkedIn