2013-05-24 4 views
0

저는 C++ 및 코딩에 새로운 것이므로 이미지를 부동 소수점 이미지로 변환 할 때 문제가 발생했습니다. 이미지의 픽셀 강도의 평균 및 표준 편차를 계산하여 오류를 반올림하기 위해 데이터를 상당히 효과적으로 시작하기 위해이 작업을 시도하고 있습니다. 내 코드는 아래와 같습니다..tif에서 부동 소수점 이미지로 변환

Mat img = imread("Cells2.tif"); 

cv::namedWindow("stuff", CV_WINDOW_NORMAL); 
cv::imshow("stuff",img); 
CvMat cvmat = img; 
Mat dst = cvCreateImage(cvGetSize(&cvmat),IPL_DEPTH_32F,1); 
cvConvertScale(&cvmat,&dst); 
cvScale(&dst,&dst,1.0/255); 
cvNamedWindow("Test",CV_WINDOW_NORMAL); 
cvShowImage("Test",&dst); 

그리고이 오류에

OpenCV의 오류를 실행하고 있습니다 : 잘못된 인수 알 수없는 함수, 파일 ...... \ 모듈 \ 코어 \ SRC \ (배열이 CvMat 또는 IplImage해야한다) array.cpp, line 1238

나는 어디에서나 보았고 모든 사람들이 img를 위에서 시도한 CvMat로 변환한다고 말하고 있었다. 위의 코드와 같이했을 때 OpenCV 오류 : 알 수없는 함수, 파일 ...... \ modules \ core \ src \ matrix.cpp에 잘못된 인수 (알 수없는 배열 유형)가 있습니다. 697

감사합니다 사전에 도움을 청하십시오.

답변

0

C 인터페이스 대신 C++ OpenCV 인터페이스를 사용하고 데이터 유형간에 변환하려면 convertTo 함수를 사용하십시오. 질문의

Mat img = imread("Cells2.tif"); 
cv::imshow("source",img); 
Mat dst; // destination image 

// check if we have RGB or grayscale image 
if (img.channels() == 3) { 
    // convert 3-channel (RGB) 8-bit uchar image to 32 bit float 
    src.convertTo(dst, CV_32FC3); 
} 
else if (img.channels() == 1) { 
    // convert 1-chanel (grayscale) 8-bit uchar image to 32 bit float 
    img1.convertTo(dst, CV_32FC1); 
} 

// display output, note that to display dst image correctly 
// we have to divide each element of dst by 255 to keep 
// the pixel values in the range [0,1]. 
cv::imshow("output",dst/255); 
waitKey(); 

두 번째 부분은 여기에 C++에서 OpenCV의 평균을 계산하는 내 코드입니다 dst

cv::Salar avg_pixel; 
double avg; 

// note that Scalar is a vector. 
// If your image is RGB, Scalar will contain 3 values, 
// representing color values for each channel. 
avg_pixel = cv::mean(dst); 

if (dst.channels() == 3) { 
    //if 3 channels 
    avg = (avg_pixel[0] + avg_pixel[1] + avg_pixel[2])/3; 
} 
if(dst.channels() == 1) { 
    avg = avg_pixel[0]; 
} 
cout << "average element of m: " << avg << endl; 
+0

흠 작동합니다. 그러나이 실제로 내 반올림 오류를 제거하려면 보이지 않았다. 내가 지금 코드를 실행할 때 내 평균은 1656.76의 값을 내고 Matlab의 평균 함수는 1776.23을 반환하고 cv :: Scalar z = mean (dst); 돌아 오는 중 1612.36 ... 어떤 아이디어? – VeniVici

+0

다른 질문을하고 있습니다. 전환 방법은 정확합니다. 아마 평균 값을 계산하는 방법 일 것입니다. 평균 계산을위한 Matlab 또는 OpenCV 코드를 표시 할 수 있습니까? – Alexey

+0

물론 도움을 주셔서 감사합니다. 내 코드는 아래와 같습니다. – VeniVici

0

에있는 모든 요소의 평균을 계산합니다.

int NumPixels = img.total(); 


double avg; 
double c; 
    for(int y = 0; y <= img.cols; y++) 
     for(int x = 0; x <= dst.rows; x++) 
     c+=img.at<uchar>(x,y); 
     avg = c/NumPixels; 

    cout << "Avg Value\n" << 255*avg; 

MATLAB의 경우 이미지를로드하고 Q = mean (img (:)); which return 1776.23 그리고 1612.36의 반환을 위해 나는 cv : Scalar z = mean (dst);를 사용했다.

+0

예. 색상으로 입력합니다 (흑백으로 보이는 진한 현미경 이미지 임에도 불구하고). 하지만 그것을로드 한 직후에 나는 cvCvtColor (img, dst, CV_BGR2GRAY)를 사용하여 회색으로 변환합니다; – VeniVici

관련 문제