Files
2026-01-31 14:38:00 +08:00

70 lines
1.9 KiB
C++

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
int edgegrad = 0;
int h, w;
cin >> h >> w;
vector<vector<double>> diffSum(h + 1, vector<double>(w + 1, 0));
vector<vector<int>> Ir(h, vector<int>(w)), Ig(h, vector<int>(w)), Ib(h, vector<int>(w));
for(int i=0; i<h; i++) for(int j=0; j<w; j++) cin >> Ir[i][j];
for(int i=0; i<h; i++) for(int j=0; j<w; j++) cin >> Ig[i][j];
for(int i=0; i<h; i++) for(int j=0; j<w; j++) cin >> Ib[i][j];
for(int i=0; i<h; i++) {
for(int j=0; j<w; j++) {
int kr; cin >> kr;
diffSum[i+1][j+1] += pow(Ir[i][j] - kr, 2);
}
}
for(int i=0; i<h; i++) {
for(int j=0; j<w; j++) {
int kg; cin >> kg;
diffSum[i+1][j+1] += pow(Ig[i][j] - kg, 2);
}
}
for(int i=0; i<h; i++) {
for(int j=0; j<w; j++) {
int kb; cin >> kb;
diffSum[i+1][j+1] += pow(Ib[i][j] - kb, 2);
}
}
vector<vector<double>> s(h + 1, vector<double>(w + 1, 0));
for(int i=1; i<=h; i++) {
for(int j=1; j<=w; j++) {
s[i][j] = diffSum[i][j] + s[i-1][j] + s[i][j-1] - s[i-1][j-1];
}
}
double minM = 1e18;
for(int x1=1; x1<=h; x1++) {
for(int y1=1; y1<=w; y1++) {
for(int x2=x1; x2<=h; x2++) {
for(int y2=y1; y2<=w; y2++) {
int curH = x2 - x1 + 1;
int curW = y2 - y1 + 1;
if(curH >= (h + 1) / 2 && curW >= (w + 1) / 2) {
double totalDiff = s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1];
double M = totalDiff / (3.0 * curH * curW);
if(M < minM) minM = M;
}
}
}
}
}
double psnr = 20.0 * log10(255.0 / sqrt(minM));
cout << psnr << endl;
return 0;
}