مقایسه دو تصویر - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۱۵۱ نفر آنلاین
۰ عضو و ۱۵۱ مهمان در سایت حاضرند

مقایسه دو تصویر

0 امتیاز
120 بازدید
سلام.

برای مقایسه دو تصویر با هم چه روش هایی وجود داره؟ حتی المکان روش هایی را پیشنهاد بدید که در کتابخانه Opencv پیاده سازی شده است.

ویرایش: البته من قصد دارم فریم متوالی که از دوربین دریافت میشه را با هم مقایسه کنم فریم هایی که تغییرات زیادی دارند را شناسایی کنم.
سوال شده خرداد 22, 1396  بوسیله ی محسن ستاری پور (امتیاز 23)   2

2 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام.توصیه نمی کنم برای اینکار از توابع دم دستی همچون cv::compare استفاده کنید.البته بر حسب اینکه جون فرمودید قصد دارید فریم های متوالی را بررسی کنید.

حتی از طریق هیستوگرام هم میشه مقایسه انجام داد ولی مقایسه ممکن چنان دقیق و مطلوب نباشه.

یکی از روش هایی که به طور خاص در این موارد استفاده میشه روش psnr است که دقت خیلی خوبی نسبت به روش های قبلی دارد.

یکی از روش های خیلی دقیق تر در این زمنه multi scal strcutrual similarity که پیاده سازی آن وجود داره.

Scalar getMSSIM( const Mat& i1, const Mat& i2)
{
 const double C1 = 6.5025, C2 = 58.5225;
 /***************************** INITS **********************************/
 int d     = CV_32F;

 Mat I1, I2;
 i1.convertTo(I1, d);           // cannot calculate on one byte large values
 i2.convertTo(I2, d);

 Mat I2_2   = I2.mul(I2);        // I2^2
 Mat I1_2   = I1.mul(I1);        // I1^2
 Mat I1_I2  = I1.mul(I2);        // I1 * I2

 /***********************PRELIMINARY COMPUTING ******************************/

 Mat mu1, mu2;   //
 GaussianBlur(I1, mu1, Size(11, 11), 1.5);
 GaussianBlur(I2, mu2, Size(11, 11), 1.5);

 Mat mu1_2   =   mu1.mul(mu1);
 Mat mu2_2   =   mu2.mul(mu2);
 Mat mu1_mu2 =   mu1.mul(mu2);

 Mat sigma1_2, sigma2_2, sigma12;

 GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
 sigma1_2 -= mu1_2;

 GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
 sigma2_2 -= mu2_2;

 GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
 sigma12 -= mu1_mu2;

 ///////////////////////////////// FORMULA ////////////////////////////////
 Mat t1, t2, t3;

 t1 = 2 * mu1_mu2 + C1;
 t2 = 2 * sigma12 + C2;
 t3 = t1.mul(t2);              // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))

 t1 = mu1_2 + mu2_2 + C1;
 t2 = sigma1_2 + sigma2_2 + C2;
 t1 = t1.mul(t2);               // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))

 Mat ssim_map;
 divide(t3, t1, ssim_map);      // ssim_map =  t3./t1;

 Scalar mssim = mean( ssim_map ); // mssim = average of ssim map
 return mssim;
}

فازغ از روش های ذکر شده در بالا روش های پیچیده تری هم وجود دارند که بر پایه استخراج ویژگی هستند  که میزان اختلاف را دقیق تر محاسبه می کنند ولی بار محاسباتی بیشتری نسبت به دو روش فوق دارند.

پاسخ داده شده تیر 4, 1396 بوسیله ی farnoosh (امتیاز 2,686)   5 15 49
ممنون از پاسخ شما.
–2 امتیاز

با سلام.

به ابن لینک یک سر بزن.

با .Net نوشته شده.

پاسخ داده شده تیر 4, 1396 بوسیله ی ابوالفضل عباسی (امتیاز 7)   2
...