从.tif转换为浮点图像 我对C++和编码比较新,当试图把图像转换成浮点图像时遇到了问题。我试图通过计算图像像素强度的平均值和标准偏差来消除舍入误差,因为它开始对数据产生相当大的影响。我的代码如下 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);

从.tif转换为浮点图像 我对C++和编码比较新,当试图把图像转换成浮点图像时遇到了问题。我试图通过计算图像像素强度的平均值和标准偏差来消除舍入误差,因为它开始对数据产生相当大的影响。我的代码如下 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);,c++,tiff,iplimage,C++,Tiff,Iplimage,我遇到了这个错误 OpenCV错误:未知函数的文件……\modules\core\src\Array.cpp的第1238行中存在错误参数(数组应为CvMat或IplImage) 我到处寻找,每个人都说要将img转换为CvMat,我在上面尝试过。 当我按照上面的代码那样做时,我得到了 OpenCV错误:未知函数中的错误参数(未知数组类型),文件……\modules\core\src\matrix.cpp行697 谢谢您的帮助。 < P>只是使用C++ OpenCV接口代替C接口,使用函数在数据类型

我遇到了这个错误

OpenCV错误:未知函数的文件……\modules\core\src\Array.cpp的第1238行中存在错误参数(数组应为CvMat或IplImage)

我到处寻找,每个人都说要将img转换为CvMat,我在上面尝试过。 当我按照上面的代码那样做时,我得到了 OpenCV错误:未知函数中的错误参数(未知数组类型),文件……\modules\core\src\matrix.cpp行697


谢谢您的帮助。

< P>只是使用C++ OpenCV接口代替C接口,使用函数在数据类型之间进行转换。
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();
问题的第二部分计算
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; 
cv::萨拉尔平均像素;
双平均值;
//请注意,标量是一个向量。
//如果图像为RGB,则标量将包含3个值,
//表示每个通道的颜色值。
平均像素=cv::平均值(dst);
如果(dst.channels()==3){
//如果有3个频道
avg=(avg_像素[0]+avg_像素[1]+avg_像素[2])/3;
}
如果(dst.channels()==1){
平均值=平均像素[0];
} 

CUT< P>这是我在C++ opencv中计算平均值的代码。p>
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;
int NumPixels=img.total();
双平均值;
双c;

对于(int y=0;y-Hmm)它是有效的。然而,这似乎并没有真正消除我的舍入错误。当我现在运行代码时,我的平均值为1656.76,而Matlab中的平均值函数返回1776.23和cv::Scalar z=mean(dst)你会问另一个问题吗?你问的是一个不同的问题。转换方法是正确的,它可能是你如何计算平均值。你能用MATLAB或OpenCV代码来计算平均值吗?如果它弄坏了你的问题,请考虑点击旁边的复选标记,以从空心T中切换它。哦,格林多!对不起,以前从未使用过stackoverflow。谢谢:)!嗯,所以我尝试了你的编辑,它返回1612.36,就像我用cv::mean(dst)说的那样;功能。你知道为什么内置的MATLAB函数会返回1776吗?这是完全不同的。是的,它作为颜色输入(虽然它是一个真正的黑色和白色的显微镜图像);但加载后,我立即使用CVT颜色(img、dst、CV_BGR2GRAY)将其转换为灰色;