이것은 매우 간단한 요청처럼 보입니다. 그러나 문제는 조금 미묘합니다. 난 그냥 X와 Y 유도체의 8 비트 부호없는 버전을 원한다. 원본 이미지도 8 비트 부호가 없습니다. 내가 정말 싫어하는 것은 normalize
기능의 사용이OpenCV를 사용하여 X 및 Y 파생 값의 절대 값을 계산하십시오.
cv::Mat dx, dy;
cv::Sobel(img, dx, CV_16S, 1, 0);
cv::Sobel(img, dy, CV_16S, 0, 1);
dx = cv::abs(dx);
dy = cv::abs(dy);
cv::normalize(dx, dx8u, 0x00, 0xFF, cv::NORM_MINMAX, CV_8U);
cv::normalize(dy, dy8u, 0x00, 0xFF, cv::NORM_MINMAX, CV_8U);
입니다 :
는 여기에 내가 사용했던 하나의 방법입니다. 낭비되는 것 같습니다. Sobel 연산자를 직접 계산하여 8 비트 이미지로 만들려고하면 (ddepth
을 -1
으로 설정) 모든 음수 값을 "잘라내는"것처럼 보입니다. 절대 값을 계산하고 8로 나누면 (Sobel 연산자의 절대 값을 [0, 255]로 매핑), 여전히 16 비트 이미지이므로 8 비트로 변환해야합니다. 다시 낭비가 보인다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
문제의 중요한 부분은 16 비트 서명 이미지에서 작업을 수행하고 어떻게 든 결과가 8 비트 이미지에 직접 배치되는 것입니다. 그렇게하면 사실 이후 추가 전환을 실행할 필요가 없습니다.
UPDATE :
여기에 최종 솔루션입니다 :
cv::Mat dx, dy;
cv::Sobel(m, dx, CV_16S, 1, 0);
cv::Sobel(m, dy, CV_16S, 0, 1);
cv::convertScaleAbs(dx/8, dx);
cv::convertScaleAbs(dy/8, dy);
결과를'[0, 255]'로 정규화 할 필요가 있습니까, 아니면 절대 값을 얻으려고 시도하는 결과입니까? – Aurelius
@Aurelius 오른쪽 - 정확히 [0,255] 사이에 필요가 없습니다. OpenCV 기능을 사용하여 원하는대로 접근 할 수있는 유일한 방법 중 하나입니다. normalize 함수는 형식이 작동 할 때 형식을 8 비트로 변환하므로 상당히 효율적으로 보입니다. – aardvarkk