считая яркие пиксели и суммируя их.Медицинское изображение C ++ - PullRequest
1 голос
/ 10 ноября 2011

В настоящее время я работаю над проектом в области медицинской техники. У меня есть большое изображение с несколькими подизображениями клетки, поэтому моя первая задача - разделить изображение.

Я подумал о следующем:

Преобразование изображения в двоичный файл

выполняется проекция пикселей яркости на ось 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;
}

но это дало мне ошибку: Ошибка подтверждения (0 <= colRange.start && colRange.start <= colRange.end && colRange.end <= m.cols) в Mat, файл /home/usuario/OpenCV-2.2.0/modules/core/src/matrix .cpp, строка 276 </p>

Не знаю, любая идея была бы полезна, в любом случае большое спасибо mevatron, вы действительно оставили меня в пути.

1 Ответ

2 голосов
/ 10 ноября 2011

Если вы просто хотите получить сумму двоичного изображения, вы можете просто взять 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);

Мой тестовый пример представлял собой квадратную матрицу, так что ошибка не была найдена ...

Надеюсь, что это полезно!

...