计算明亮的像素并将它们相加。医学图像 C++

Posted

技术标签:

【中文标题】计算明亮的像素并将它们相加。医学图像 C++【英文标题】:counting bright pixels and summing them. Medical Image 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,你真的让我挡了路。

【问题讨论】:

【参考方案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。 好的,我认为它正在工作,如果有任何变化,我会及时通知您。 好吧,这个错误太可笑了,今天早上我意识到,好吧,现在,是的,它确实运作良好。谢谢

以上是关于计算明亮的像素并将它们相加。医学图像 C++的主要内容,如果未能解决你的问题,请参考以下文章

常见的医学影像数据格式及其读取与保存

常见的医学影像数据格式及其读取与保存

医学图像处理期末复习

医学图像处理期末复习

医学图像分割及应用

自然和医学图像的深度语义分割:网络结构