подсчет ярких пикселей и их суммирование. Медицинское изображение C

#opencv #division #pixels #brightness #counting

#opencv #разделение #пиксель #яркость #подсчет

Вопрос:

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

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

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

делаю проекцию пикселей яркости на ось x, чтобы я мог видеть, где есть промежутки между значениями яркости, а затем разделяю изображение.

Проблема возникает, когда я пытаюсь добраться до второй части. Моя идея заключается в использовании вектора в качестве проекции и суммировании всех значений яркости по всему столбцу, так что номер позиции 0 вектора является суммой всех значений яркости, которые находятся в первом столбце изображения, одинаков до тех пор, пока я не дойду до последнего столбца, так что в конце у меня есть проекция.

Вот как я пытался:

 void calculo(cv::Mat amp;result,cv::Mat amp;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::Matamp; 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 amp;amp; colRange.start <= colRange.end amp;amp; colRange.end <= m.cols) в Mat, файле /home/usuario/OpenCV-2.2.0/modules/core/src/matrix.cpp, строка 276

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

Ответ №1:

Если вам просто нужна сумма двоичного изображения, вы могли бы просто взять L1-норму. Вот так:

 Mat binaryVectorSum(const Matamp; 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);
  

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

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

Комментарии:

1. Хорошо, завтра утром я попробую это, я попытаюсь загрузить результаты, если я не смогу этого сделать, поговорим в понедельник. Большое спасибо! я начинал немного сходить с ума, и я только в начале … 🙂

2. Хорошо, я пытаюсь сделать это так, но у меня проблема с компиляцией при использовании функции norm. В нем говорится, что NORM_L1 не был объявлен в этой области, поэтому я еще не мог его попробовать. Я подумал, что, возможно, это из-за проблемы со связыванием библиотек, но я думаю, что я связал все библиотеки, например: #включить <iostream> #включить «cv.h» #включить «highgui.h» #включить <stdio.h> #включить «opencv2 / imgproc / imgproc.hpp»

3. хорошо, я понял, что суммировал строки, и это дало мне ошибку размерности, поскольку я хотел бы получить сумму всех значений яркости по одному столбцу, я просто change:output.at <double>(0, i) = norm(binary.row(i), NORM_L1); Для output.at <double>(0, i) = norm(binary.col(i), NORM_L1); И NORM_L1 для 1.

4. Хорошо, я думаю, что это работает, я буду держать вас в курсе, если что-то изменится.

5. Хорошо, ошибка была такой нелепой ошибкой, я понял это сегодня утром, хорошо, прямо сейчас, да, это определенно работает хорошо. Спасибо