1

現在、私は医用工学のプロジェクトに取り組んでいます。セルのいくつかのサブイメージを含む大きなイメージがあるので、最初のタスクはイメージを分割することです。

次のことを考えました。

イメージをバイナリに変換する

明るさのピクセルを x 軸に投影して、明るさの値の間にギャップがある場所を確認し、画像を分割します。

問題は、第 2 部に到達しようとしたときに発生します。私の考えは、投影としてベクトルを使用し、1 つの列に沿ってすべての明るさの値を合計することです。したがって、ベクトルの位置番号 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;              
    }
} 

このコードを実行すると、違反エラーが発生します。もう 1 つの問題は、1 つの一意の行でマトリックスを作成できないことです。そのため、どうすればよいかわかりません。

何か案は?!ありがとう!


最後に、それは機能しません。すべてのピクセルを 1 つの 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;
}

しかし、それは私に間違いを与えました:マット、ファイル/home/usuario/OpenCV-2.2.0/でアサーションが失敗しました(0 <= colRange.start && colRange.start <= colRange.end && colRange.end <= m.cols) modules/core/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;
}

私は仕事をしているので、テストすることはできませんが、それはあなたを近づけるはずです.

編集:家に帰りました。テストしました。できます。:) 注意点が 1 つあります...この関数は、バイナリ マトリックスが真のバイナリ (つまり、0 と 1) の場合に機能します。バイナリマトリックスが0と255の場合、最大値でノルム出力をスケーリングする必要がある場合があります。

編集: .cpp ファイルにない場合は、このようusing namespace cv;に使用する名前空間を宣言する必要があります。NORM_L1cv::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 に答える