Main Content

Sobel 메서드를 사용한 경계 검출을 반정밀도 유형으로 수행

이 예제에서는 MATLAB® 함수로부터 생성한 CUDA® MEX 함수를 사용하여 영상에서 경계 검출을 수행하는 방법을 보여줍니다. 경계 검출 알고리즘은 반정밀도 데이터형을 사용하여 구현되었습니다.

타사 선행 조건

필수

이 예제는 CUDA MEX를 생성하며, 다음과 같은 타사 요구 사항이 있습니다.

  • 최소 Compute Capability 6.0을 갖춘 CUDA 지원 NVIDIA® GPU 및 호환되는 드라이버.

선택 사항

정적, 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.

GPU 환경 확인하기

coder.checkGpuInstall 함수를 사용하여 이 예제를 실행하는 데 필요한 컴파일러와 라이브러리가 올바르게 설치되었는지 확인합니다.

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Sobel 경계 검출 알고리즘

Sobel 경계 검출 알고리즘 sobelEdgeDetectionAlg.m에서는 회색조 영상에서 2차원 공간 기울기 연산이 수행됩니다. 이 연산은 입력 영상에서 경계에 해당하는 고주파수 공간 영역을 강조합니다.

type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh)  %#codegen
%sobelEdgeDetection Example MATLAB function for edge detection.
% Copyright 2018 The MathWorks, Inc.

kern = half([1 2 1; 0 0 0; -1 -2 -1]);

% Finding horizontal and vertical gradients.
h = conv2(img(:,:,2),kern,'same');
v = conv2(img(:,:,2),kern','same');

% Finding magnitude of the gradients.
e = sqrt(h.*h + v.*v);

% Threshold the edges
edgeImg = uint8((e > thresh) * 240);

end

Sobel 경계 알고리즘은 두 개의 직교 필터 커널인 maskXmaskY를 사용하여 입력 영상의 가로 방향 기울기 resX와 세로 방향 기울기 resY를 계산합니다. 필터링 연산 후에는 기울기 크기를 계산하고 임계값을 적용하여 영상에서 경계로 식별되는 영역을 찾습니다.

영상을 읽어들이고 데이터를 RGBA 형식의 열 우선 순서로 저장하기

표준 imread 명령을 사용하여 영상을 읽어옵니다. imread는 영상의 RGB 채널을 각 픽셀마다 하나의 정수로 표현합니다. 정수 범위는 0에서 255까지입니다. 입력값을 half 유형으로 형변환하면 컨벌루션 중에 오버플로가 발생할 수 있습니다. 이 경우 영상을 0에서 1 사이의 값으로 스케일링할 수 있습니다.

im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;

함수에 대한 CUDA MEX 생성하기

sobelEdgeDetectionAlg 함수에 대한 CUDA MEX를 생성하려면 GPU 코드 구성 객체를 만들고 codegen 명령을 실행합니다. 반정밀도 데이터형으로 코드를 생성하고 실행하려면 CUDA Compute Capability가 6.0 이상이어야 합니다. 코드 구성 객체의 ComputeCapability 속성을 '6.0'으로 설정합니다. 반정밀도 유형의 경우 CUDA 코드 생성을 위한 메모리 할당(malloc) 모드를 'Discrete'로 설정해야 합니다.

cfg = coder.gpuConfig('mex');
cfg.GpuConfig.ComputeCapability = '6.0';
cfg.GpuConfig.MallocMode = 'Discrete';

codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;
Code generation successful.

MEX 함수 실행하기

MEX 함수가 생성되었으면 이 함수가 원래의 MATLAB 진입점 함수와 동일한 기능을 갖는지 확인할 수 있습니다. 생성된 sobelEdgeDetectionAlg_mex를 실행하고 결과를 플로팅합니다.

out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh);
imagesc(out_disp);

MEX 메모리 지우기.

메모리로 불러온 정적 network 객체를 지웁니다.

clear mex;

참고 항목

함수

객체

관련 항목