일반적으로 가장자리 감지 기능이 다운되어 높은 경사도 값으로 이미지 영역을 감지합니다.
우리의 경우 이미지 함수의 파생물로 그라디언트를 대략적으로 볼 수 있으므로 그라디언트의 크기는 이미지가 로컬 에서 얼마나 많이 변경 되는지에 대한 정보를 제공합니다 (인접한 픽셀 / 텍셀과 관련).
이제 가장자리는 불연속의 표시라고 말 했으므로 이제 그라디언트를 정의 했으므로이 정보 만 있으면됩니다. 이미지의 그라디언트를 찾으면 이진 값 에지 / 비 에지 값을 얻기 위해 임계 값을 적용하기 만하면됩니다.
이 그라디언트는 실제로 당신이 요구하는 것인데 어떻게 대답하지 않습니까?
많은 방법! 여기에 몇 가지 :)
내장 셰이더 기능
hlsl과 glsl은 모두 미분 함수를 제공합니다. GLSL 에는 x와 y 방향의 그라디언트 정보를 제공하는 dFdx와 dFdy 가 있습니다. 일반적으로 이러한 기능은 2x2 조각으로 평가됩니다.
단일 방향에 관심이 없으면 영역의 그라디언트가 얼마나 강한 지 나타내는 컴팩트 한 결과를 얻는 좋은 방법 은 dFdy와 dFdy의 절대 값의 합 외에 다른 것을 제공하지 않습니다.
특정 채널이 아닌 전체 이미지의 가장자리에 관심이있을 수 있으므로 이미지 기능을 루마로 변환 할 수 있습니다. 이를 염두에두고, 가장자리 감지와 관련하여 쉐이더는 다음과 같은 것을 포함 할 수 있습니다.
float luminance = dot(yourFinalColour,vec3(0.2126, 0.7152, 0.0722));
float gradient = fwidth(luminance );
float isEdge = gradient > threshold;
임계 값이 높으면 가장자리가 거칠고 반대로 임계 값이 낮 으면 잘못된 가장자리를 감지 할 수 있습니다. 요구 사항에 더 적합한 임계 값을 찾기 위해 실험해야합니다.
이러한 기능이 작동하는 이유는 언급 할 가치가 있지만 지금은 시간이 없습니다. 나중에이 답변을 업데이트 할 가능성이 큽니다.
화면 공간 후 처리
이보다 더 멋진 경험을 할 수 있습니다. 이제 이미지 처리에서 가장자리 감지 필드가 엄청납니다. 필요에 따라 에지 감지를 감지하는 수십 가지 좋은 방법을 인용 할 수는 있지만, 지금 당장 간단하게 유지하십시오. 관심이 있으시면 더 많은 옵션을 인용 할 수 있습니다!
따라서 아이디어는 위의 것과 비슷하지만 더 넓은 이웃을보고 원하는 경우 해리 운딩 샘플에 가중치 세트를 사용할 수 있다는 차이점이 있습니다. 일반적으로 좋은 그라디언트 정보를 제공하는 커널을 사용하여 이미지를 컨볼 루션으로 실행합니다.
가장 일반적인 선택은 Sobel 커널입니다
각각 x 및 y 방향의 그라디언트를 제공합니다.
와 같이 기울기에서 단일 값을 얻을 수 있습니다.G r a d난 전자 N t MgN 난 마에 유 거라고e = ( G r a d난 전자 N t를엑스)2+ ( G r a d난 전자 N t를와이)2−−−−−−−−−−−−−−−−−−−−−−−√
그런 다음 위에서 언급 한 것과 같은 방식으로 임계 값을 지정할 수 있습니다.
보시 다시피이 커널은 중앙 픽셀에 더 많은 가중치를 부여하므로 그라디언트 + 약간의 스무딩을 효과적으로 계산하는 데 도움이됩니다.
위의 내용은 잘 작동하지만 스무딩이 마음에 들지 않으면 Prewitt 커널을 사용할 수 있습니다.
(참고로 서두르면 곧 이미지 대신 적절한 형식의 텍스트를 작성합니다!)
실제로 실시간 그래픽이 아닌 이미지 프로세스 방식으로 에지 감지를 찾을 수있는 커널과 기술이 훨씬 더 많으므로 dFdx / y 함수를 사용하면 더 복잡한 방법을 배제 할 수 있습니다. .