首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ 圖像檢索系統相似度異常:負值與排序錯誤根因分析

     編輯:程式設計綜合問答

現象

均方差 (MSE) 理論上 ≥ 0,但顯示負值;排序後相似度非遞增/遞減序。

核心原因排查

  1. 數值溢出/下溢 (最可能):
    • 像素差值平方累加超出 `int`/`long` 範圍(如 4K 圖像 800萬像素 × 255² ≈ 5.2e11,超 32 位有符號整數 2.1e9)。
    • 累加變量聲明為有符號整數,溢出繞回負數。
    • 修正:累加器使用 `double` 或 `int64_t` (`long long`),單步轉型:`sum += (double)(p1 - p2) * (p1 - p2);`。
  2. 算法邏輯錯誤:
    • 相似度定義混淆:MSE 越小越相似,若直接作為「相似度分數」排序需取倒數或負號。
    • 歸一化公式錯誤:如 `similarity = 1 - MSE / MAX_MSE`,若 `MSE > MAX_MSE` 產生負值。
  3. 排序比較器錯誤:
    • C++ `std::sort` 比較函數未嚴格弱序(如返回 `a <= b` 而非 `a < b`),導致未定義行為,輸出順序亂序。
    • 浮點數比較未考慮精度:`fabs(a-b) < eps` 判等。

調試建議

  • 對單張圖像打印中間變量:像素差、平方和、MSE 最終值,驗證計算鏈路。
  • 使用單元測試框架 (Google Test) 覆蓋已知答案的標準圖像對。
  • 啟用編譯器未定義行為檢測:`-fsanitize=undefined` (GCC/Clang) / `/RTC1` (MSVC)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved