#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. Хорошо, ошибка была такой нелепой ошибкой, я понял это сегодня утром, хорошо, прямо сейчас, да, это определенно работает хорошо. Спасибо