【问题标题】:counting bright pixels and summing them. Medical Image C++计算明亮的像素并将它们相加。医学图像 C++
【发布时间】:2011-11-10 14:40:52
【问题描述】:

目前,我正在从事一个医学工程项目。我有一张大图,里面有几个单元格的子图,所以我的首要任务是分割图像。

我想到了接下来的事情:

将图像转换为二进制

将亮度像素投影到 x 轴,这样我就可以看到亮度值之间的差距,然后分割图像。

当我尝试进入第二部分时,问题就来了。我的想法是使用向量作为投影并将所有亮度值沿一列求和,因此向量的位置编号 0 是图像第一列中所有亮度值的总和,直到我到达最后一列,所以最后我有了投影。

这就是我尝试过的方法:

void calculo(cv::Mat &result,cv::Mat &binary){  //result=the sum,binary the imag.

    int i,j;

    for (i=0;i<=binary.rows;i++){
        for(j=0;j<=binary.cols;j++){
                cv::Scalar intensity= binaria.at<uchar>(j,i);
                result.at<uchar>(i,i)=result.at<uchar>(i,i)+intensity.val[0];
        }
        cv::Scalar intensity2= result.at<uchar>(i,i);
        cout<< "content" "\n"<< intensity2.val[0] << endl;              
    }
} 

执行此代码时,出现违规错误。另一个问题是我无法创建一个具有唯一行的矩阵,所以...我不知道该怎么办。

有什么想法吗?!谢谢!


最后,它不起作用,我需要将所有像素汇总在一个 COLUMN 中。我做到了:

cv::Mat suma(cv::Mat& matrix){

int i;

cv::Mat output(1,matrix.cols,CV_64F);


for (i=0;i<=matrix.cols;i++){
        output.at<double>(0,i)=norm(matrix.col(i),1);   
    }
    return output;
}

但这给了我一个错误: Mat,文件/home/usuario/OpenCV-2.2.0/modules/core/src/matrix中的断言失败(0

我不知道,任何想法都会有帮助,无论如何非常感谢 mevatron,你真的让我挡了路。

【问题讨论】:

    标签: opencv division pixels brightness counting


    【解决方案1】:

    如果您只想要二值图像的总和,您可以简单地采用 L1 范数。像这样:

    Mat binaryVectorSum(const Mat& binary)
    {
        Mat output(1, binary.rows, CV_64F);
        for(int i = 0; i < binary.rows; i++)
        {
            output.at<double>(0, i) = norm(binary.row(i), NORM_L1);
        }
    
        return output;
    }
    

    我在工作,所以我无法测试它,但这应该能让你接近。

    编辑:回家了。测试了它。有用。 :) 一个警告...如果您的二进制矩阵是真正的二进制(即 0 和 1),则此功能有效。如果二进制矩阵是 0 和 255,您可能需要使用最大值缩放范数输出。

    编辑:如果您的 .cpp 文件中没有 using namespace cv;,那么您需要声明命名空间以使用 NORM_L1,例如 cv::NORM_L1

    在调用函数之前,您是否考虑过转置矩阵?像这样:

    sumCols = binaryVectorSum(binary.t());
    

    对比

    sumRows = binaryVectorSum(binary);
    

    编辑:我的代码有一个错误 :) 我改变了:

    Mat output(1, binary.cols, CV_64F);
    

    Mat output(1, binary.rows, CV_64F);
    

    我的测试用例是方阵,所以没有发现这个bug...

    希望对您有所帮助!

    【讨论】:

    • 好的,明天早上我会试试,我会尝试上传结果,如果我不能这样做,周一再谈。非常感谢!我有点疯了,我才刚刚开始...... :)
    • 好的,我正在尝试这样做,但是在使用 norm 函数时出现编译问题。它说,NORM_L1 没有在这个范围内声明,所以我还不能尝试。我认为可能是因为链接库问题,但我认为我链接了所有库,例如:#include #include "cv.h" #include "highgui.h" #include #include "opencv2/imgproc/imgproc.hpp"
    • 好的,我意识到我正在对行求和,这给了我一个维度错误,因为我想对一列中的所有亮度值求和,我只是更改:输出。 at(0, i) = norm(binary.row(i), NORM_L1);对于 output.at(0, i) = norm(binary.col(i), NORM_L1); NORM_L1 为 1。
    • 好的,我认为它正在工作,如果有任何变化,我会及时通知您。
    • 好吧,这个错误太可笑了,今天早上我意识到,好吧,现在,是的,它确实运作良好。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2020-07-10
    • 1970-01-01
    • 2022-10-17
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多