70 lines
1.9 KiB
C++
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;
|
|
}
|