目前,我正在从事医学工程项目。我有一个包含细胞的几个子图像的大图像,所以我的第一个任务是划分图像。
我想到了下一件事:
将图像转换为二进制
将亮度像素投影到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,你真的让我不在路上。
答案 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 ...
希望有帮助!