【问题标题】:Converting to Floating Point Image from .tif从 .tif 转换为浮点图像
【发布时间】:2013-05-30 22:48:38
【问题描述】:

我对 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);

我遇到了这个错误

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: c++ tiff iplimage


    【解决方案1】:

    只需使用 C++ OpenCV 接口代替 C 接口,并使用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();
    

    问题的第二部分要计算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; 
    

    【讨论】:

    • 嗯,它有效。然而,这似乎并没有真正消除我的舍入错误。当我现在运行代码时,我的平均值吐出 1656.76 而 Matlab 中的平均函数返回 1776.23 和 cv::Scalar z = mean(dst);正在返回 1612.36... 有什么想法吗?
    • 您问的是不同的问题。转换方法是正确的,这可能是您计算平均值的方式。你能展示你的 Matlab 或 OpenCV 代码来计算平均值吗?
    • 如果它回答了您的问题,请考虑通过单击答案旁边的复选标记将其从空心切换为绿色来接受它
    • 完成!抱歉之前从未使用过stackoverflow。
    • 谢谢:)!嗯,所以我尝试了您的编辑,它返回 1612.36,就像我使用 cv::mean(dst); 所说的那样;功能。你知道为什么内置的 MATLAB 函数 mean 返回 1776 吗?那是相当的差异。
    【解决方案2】:

    这是我在 C++ OpenCV 中计算平均值的代码。

    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(:));返回 1776.23 对于 1612.36 的返回,我使用了 cv:Scalar z = mean(dst);

    【讨论】:

    • 是的,它作为颜色输入(尽管它是一个看起来很黑的显微镜图像,看起来是黑白的);但在加载后立即使用 cvCvtColor(img, dst, CV_BGR2GRAY);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2015-11-24
    相关资源
    最近更新 更多