1

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

我想到了接下来的事情:

将图像转换为二进制

将亮度像素投影到 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;              
    }
} 

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

有任何想法吗?!谢谢!


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

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/中的断言失败(0 <= colRange.start && colRange.start <= colRange.end && colRange.end <= m.cols)模块/核心/src/matrix.cpp,第 276 行

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

4

1 回答 1

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,您可能需要用最大值缩放范数输出。

编辑:如果您using namespace cv;的 .cpp 文件中没有,那么您需要声明要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);

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

希望这有帮助!

于 2011-11-10T14:59:29.963 回答