OpenCV и C ++;сравнить два двоичных изображения и получить вывод (результат) - PullRequest
1 голос
/ 05 августа 2011

Я хочу сравнить два двоичных изображения и получить результат в результате.

Как я могу это сделать ??

Могу ли я использовать cvSobel (), чтобы сделать это ??

Двоичное изображение имеет белые края и есть способ подсчета белых пикселей или что-то в этом роде *

Спасибо!

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

попробуй cv :: сравнить: http://opencv.willowgarage.com/documentation/cpp/operations_on_arrays.html#cv-compare

cv::Mat img1 = ...
cv::Mat img2 = ...
cv::Mat result = ...

int threshold = (double)(img1.rows * img1.cols) * 0.7; 

cv::compare(img1 , img2  , result , cv::CMP_EQ );
int similarPixels  = countNonZero(result);

if ( similarPixels  > threshold ) {
   cout << "similar" << endl;
}
1 голос
/ 29 мая 2012

Вот функция, которую я написал, основанная на следующей статье. (Нужно ПРОВЕРИТЬ мой КОД! Бумага для ухода: A J Baddeley: показатель ошибки для двоичных изображений

Также у автора есть пакет статистики, где можно найти код. Это называется "spatstat" www.spatstat.org. Чтобы использовать spatstat, сначала загрузите R-Stat с http://www.r -project.org / . Метрика ошибки доступна как функция, называемая «дельтаметрическая». Чтобы просмотреть файл справки, введите help (deltametric).

Описание кода: На вход этой функции два имени файла, которые должны быть двоичными файлами изображений! Возвращаемое значение - номер ошибки Baddeley. Также следует включить заголовки OpenCV и пространство имен!

float baddeleyerror (const char * a_file, const char* b_file)
{
Mat A,B,Adist,Bdist,Z;
double c=5;
double p=2;
double nelem;
double minval, maxval;

A=imread(a_file,0);
B=imread(b_file,0);

nelem=A.rows*A.cols;

A=A>1;
B=B>1;
distanceTransform(A,Adist,CV_DIST_L1,3);
distanceTransform(B,Bdist,CV_DIST_L1,3);

min(Adist, c, Adist);
min(Bdist, c, Bdist);

minMaxLoc(Adist, &minval, &maxval, 0, 0);
Adist.convertTo(Adist, CV_8UC1, 255/maxval, 1);

minMaxLoc(Bdist, &minval, &maxval, 0, 0);
Bdist.convertTo(Bdist, CV_8UC1, 255/maxval, 1);

pow(abs(Adist-Bdist),p,Z);

return (pow(sum(Z).val[0]/nelem, 1/p));
}
0 голосов
/ 05 августа 2011

Почему бы не использовать прямое сравнение?(пиксель за пикселем) Собель все равно будет брать вам O (пиксели), поэтому сравнение пиксель за пикселем не изменит сложности.

...