题解
图像相似度
1 条题解
-
0
解题思路
两张图都是 m 行 n 列的二维数组,我们只要在对应位置比较:
如果第 1 张图的 a[i][j] 和第 2 张图的 b[i][j] 相等,就说明这个像素点一样,个数 same 加 1。
相似度 = 相同像素点个数 ÷ 总像素数(总像素数 = m × n)。
样例里相同像素点有 4 个,总像素 3×3=9 个,4 ÷ 9 ≈ 0.4444,保留两位小数就是 0.44。
关于保留两位小数:直接用整数除法会丢掉小数部分,所以我们要先算“相似度 × 100”并四舍五入。 算式 h = (same * 200 + total) / (2 * total) 就是四舍五入到百分位的技巧(分子加半个 total 再整除), 最后输出整数部分 h / 100 和小数点,再输出小数部分 h % 100;小数部分不足两位时在前面补一个 0。
参考代码
// 图像相似度:两张图对应像素点相同的个数 ÷ 总像素数,四舍五入到小数点后两位 #include <iostream> using namespace std; int a[1005][1005], b[1005][1005]; int main() { int m, n; cin >> m >> n; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) cin >> a[i][j]; // 读入第一幅图 for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) cin >> b[i][j]; // 读入第二幅图 int same = 0; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) if (a[i][j] == b[i][j]) same++; // 对应像素相同就+1 int total = m * n; int h = (same * 200 + total) / (2 * total); // 四舍五入到百分位 cout << h / 100 << "."; // 输出整数部分和小数点 int t = h % 100; if (t < 10) cout << 0; // 不足两位补0 cout << t << endl; return 0; }复杂度分析
要读入并比较 m×n 个像素,两层循环,时间复杂度 O(m×n)。两个二维数组各占 m×n 个格子,空间复杂度 O(m×n)。
- 1