计算亮像素并对它们求和。医学图像C ++

时间:2011-11-10 14:40:53

标签: opencv division pixels brightness counting

目前,我正在从事医学工程项目。我有一个包含细胞的几个子图像的大图像,所以我的第一个任务是划分图像。

我想到了下一件事:

将图像转换为二进制

将亮度像素投影到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&lt; = colRange.start&amp;&amp; colRange.start&lt; = colRange.end&amp;&amp; colRange.end&lt; = m.cols)。 0 / modules / core / src / matrix.cpp,第276行

我不知道,任何想法都会有所帮助,不管多少感谢mevatron,你真的让我不在路上。

1 个答案:

答案 0 :(得分:2)

如果你只想要二进制图像的总和,你可以简单地采用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这样{{1} }}

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

cv::NORM_L1

VS

sumCols = binaryVectorSum(binary.t());

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

sumRows = binaryVectorSum(binary);

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

我的测试用例是一个方阵,因此找不到bug ...

希望有帮助!