#include #include #include using namespace std; int main() { int edgegrad = 0; int h, w; cin >> h >> w; vector> diffSum(h + 1, vector(w + 1, 0)); vector> Ir(h, vector(w)), Ig(h, vector(w)), Ib(h, vector(w)); for(int i=0; i> Ir[i][j]; for(int i=0; i> Ig[i][j]; for(int i=0; i> Ib[i][j]; for(int i=0; i> kr; diffSum[i+1][j+1] += pow(Ir[i][j] - kr, 2); } } for(int i=0; i> kg; diffSum[i+1][j+1] += pow(Ig[i][j] - kg, 2); } } for(int i=0; i> kb; diffSum[i+1][j+1] += pow(Ib[i][j] - kb, 2); } } vector> s(h + 1, vector(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; }