2011-03-13 7 views
1

배우기 위해 일부 이미지 처리를하고 있습니다. 새 C++ iterface로 openCV를 사용하고 있습니다.OpenCV 이진 이미지 만 흰색 픽셀이 작동하지 않습니다.

나는 RGB 이미지를 가지고 있으며, 그레이 스케일 버전을 읽고, 히스토그램을 이퀄라이징 한 다음 canny를 사용하여 가장자리를 감지합니다.

질문 : Canny 함수는 그레이 스케일 이미지 또는 이진 이미지를 반환합니까? 저는 can for edge detector를 적용한 이미지의 픽셀 값을 확인하기 위해 double for 루프를 사용합니다. 그리고 나는 완전히 다른 값을 많이 가지고 있습니다. 바이너리 이미지에서 0 또는 1 (0 또는 255)의 값만 두 개 있어야합니다. 어떻게 할 수 있습니까?

내 코드 :

imagen = imread(nombre_imagen,0); //lee la imagen en escala de grises 
equalizeHist(imagen,imagen); 
Canny(binary,binary,0.66*threshold,1.33*threshold,3,true); 
for(int i=0;i<binary.rows;i++){ 
    for(int j=0;j<binary.cols;j++){ 
     std::cout << binary.at<float>(i,j)<< ","; 
    } 
    std::cout << "\n"; 
} 

이것은 183x183 행렬 나는 값 심지어 일부 nan을 많이 볼 수 있습니다. 어떻게이 바이너리를 만들 수 있습니까?

Canny 함수의 경우 그레이 스케일 이미지의 "평균"값을 얻는 임계 값을 사용합니다. 나는 그것을 여기에서 보았다 : http://www.kerrywong.com/2009/05/07/canny-edge-detection-auto-thresholding/.

답변

0

문서 (http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html?highlight=canny#Canny)을 말한다 :

공극 캐니 (CONST 매트 & 화상 매트 & 가장자리 이중 THRESHOLD1 이중 THRESHOLD2, INT apertureSize = 3, BOOL L2gradient = 거짓)

두번째 파라미터 - edges - 출력 가장자리 맵. 이미지와 크기가 같고 유형이 동일합니다.

호출시 두 번째 매개 변수와 동일한 소스 이미지가 전달되므로 이상한 결과가 발생할 수 있습니다.

+0

다른 매트 이미지를 사용하면 같은 결과입니다 – matiasfh

+0

그건 이상합니다. 내 프로그램에서는 다음과 같이 사용한다 : 'cv :: Mat after; cv :: Canny (m_mImage, 이후 50,120); ' 그리고 완벽하게 작동합니다. 어쩌면 L2gradient를 true로 설정하지 않고 시도해보십시오. 임계 값 기능이 올바르게 작동하는지 확인 했습니까? – Yax

1

바이너리 이미지는 0 ~ 255 범위하려는 경우 int (또는 unsigned int)에 캐스팅해야 할 유형 uchar있다 : 당신은 C 스타일 캐스트를 피해야한다

for(int i=0;i<edges.rows;i++) { 
    for(int j=0;j<edges.cols;j++) { 
     std::cout << (int)edges.at<uchar>(i,j)<< ","; 
    } 
    std::cout << "\n"; 
} 

을,하지만 난 떠날거야 그것은 독자에게 운동으로.

관련 문제