2013-07-23 3 views
1

이것은 매우 간단한 요청처럼 보입니다. 그러나 문제는 조금 미묘합니다. 난 그냥 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

결과를'[0, 255]'로 정규화 할 필요가 있습니까, 아니면 절대 값을 얻으려고 시도하는 결과입니까? – Aurelius

+0

@Aurelius 오른쪽 - 정확히 [0,255] 사이에 필요가 없습니다. OpenCV 기능을 사용하여 원하는대로 접근 할 수있는 유일한 방법 중 하나입니다. normalize 함수는 형식이 작동 할 때 형식을 8 비트로 변환하므로 상당히 효율적으로 보입니다. – aardvarkk

답변

4

당신은 단순히 기울기의 절대 값을해야 할 경우, 어떤 정상화없이, 당신은 cv::convertScaleAbs()를 사용할 수 있습니다. 이것은 절대 값을 찾고 한 번에 8 비트 부호없는 유형으로 변환합니다. 이 방법은 미분의 절대 값을 산출하고, 그 결과에 [0, 255] 정규화하지 않는

cv::Mat dx, dy; 
cv::Sobel(img, dx, CV_16S, 1, 0); 
cv::Sobel(img, dy, CV_16S, 0, 1); 
cv::convertScaleAbs(dx, dx); 
cv::convertScaleAbs(dy, dy); 

참고.

정규화 된 결과가 필요한 경우 게시 된 코드가 가장 좋은 방법 인 것 같습니다. 당신의 방법이 "쓸데없는"것처럼 보이는 한, 다중 데이터 패스를 만드는 것은 "낭비"에 대해 걱정하기 전에 성능 병목을 입증해야합니다.

불행히도 OpenCV는 데이터 전달 횟수를 줄이는 데 많은 도움이되지 않습니다. 이 작업을 수행하기 위해 소스를 수정하거나 실제로 필요한 경우 Sobel 작업을 직접 구현할 수 있습니다. 그러나 입증 된 문제가 아니라면 다시 걱정하지 마십시오.

+0

흠,이 기능의 사용을 좋아합니다. +/- 255보다 큰 값은 어떻게됩니까? 그것들은 단지 그 가치로 잘려 나간 것입니까? – aardvarkk

+0

사실, 내가 원하는 것을 얻기 위해서, 나는 원래의 16 비트 값을 8로 나눈 다음, 함수를 호출 할 수 있다고 생각한다. 나는 이것이 트릭을 할 것이라고 생각한다. – aardvarkk

+0

네, 작동합니다, 고마워요! 내 마지막 질문에 대한 내 질문을 확인하십시오. – aardvarkk

관련 문제