Advertisement
osipyonok

math_mod_lab2

Mar 5th, 2017
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.54 KB | None | 0 0
  1. // TEST_OPENCV.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <bits\stdc++.h>
  6. #include "opencv2/core/core.hpp"
  7. #include "opencv2/highgui/highgui.hpp"
  8. #include <iostream>
  9. #include <conio.h>
  10. #include <windows.h>
  11.  
  12. using namespace cv;
  13. using namespace std;
  14.  
  15. vector<vector<double>> Intensity(Mat & img){
  16.     vector<vector<double>> a(img.rows , vector<double>(img.cols));
  17.     for(int i = 0 ; i < img.rows ; ++i){
  18.         for(int j = 0 ; j < img.cols ; ++j){
  19.             a[i][j] = (int)img.at<uchar>(i,j);
  20.         }
  21.     }
  22.     return a;
  23. }
  24.  
  25. vector<vector<double>> Transpose(vector<vector<double>> & m){
  26.     assert(m.size() > 0);
  27.     vector<vector<double>> a(m[0].size() , vector<double>(m.size()));
  28.     for(int i = 0 ; i < m.size() ; ++i){
  29.         for(int j = 0 ; j < m[0].size() ; ++j){
  30.             a[j][i] = m[i][j];
  31.         }
  32.     }
  33.     return a;
  34. }
  35.  
  36. vector<vector<double>> Multiply(vector<vector<double>> & a , vector<vector<double>> & b){
  37.     assert(a.size() && b.size());
  38.     assert(a.size() == b[0].size());
  39.     vector<vector<double>> m(a.size() , vector<double>(b[0].size()));
  40.     for(int i = 0 ; i < a.size() ; ++i){
  41.         for(int j = 0 ; j < b[0].size() ; ++j){
  42.             for(int k = 0 ; k < b.size() ; ++k){
  43.                 m[i][j] += a[i][k] * b[k][j];
  44.             }
  45.         }
  46.     }
  47.     return m;
  48. }
  49.  
  50. vector<vector<double>> Add(vector<vector<double>> & a , vector<vector<double>> & b , double k = 1){// A + kB
  51.     assert(a.size() && a.size() == b.size());
  52.     assert(a[0].size() == b[0].size());
  53.     vector<vector<double>> m(a.size() , vector<double>(a[0].size()));
  54.     for(int i = 0 ; i < a.size() ; ++i){
  55.         for(int j = 0 ; j < a[i].size() ; ++j){
  56.             m[i][j] += a[i][j] + k * b[i][j];
  57.         }
  58.     }
  59.     return m;
  60. }
  61.  
  62. vector<vector<double>> MultK(vector<vector<double>> & a , double k){
  63.     assert(a.size());
  64.     assert(a[0].size());
  65.     vector<vector<double>> m(a.size() , vector<double>(a[0].size()));
  66.     for(int i = 0 ; i < a.size() ; ++i){
  67.         for(int j = 0 ; j < a[i].size() ; ++j){
  68.             m[i][j] = a[i][j] / k;
  69.         }
  70.     }
  71.     return m;
  72. }
  73.  
  74. vector<vector<double>> Inverse(vector<vector<double>> & a){
  75.     assert(a.size());
  76.     assert(a.size() == a[0].size());
  77.     int n = a.size();
  78.     vector<vector<double>> m(n , vector<double>(2 * n , 0.0));
  79.     for(int i = 0 ; i < n ; ++i){
  80.         for(int j = 0 ; j < n ; ++j){
  81.             m[i][j] = a[i][j];
  82.         }
  83.         m[i][i + n] = 1.0;
  84.     }
  85.     for(int i = 0 ; i < n ; ++i){
  86.         double t = m[i][i];
  87.         if(fabs(t) < 1e-7)return vector<vector<double>>(0);
  88.         for(int j = i ; j < 2 * n ; ++j){
  89.             m[i][j] = m[i][j] / t;
  90.         }
  91.         for(int j = 0 ; j < n ; ++j){
  92.             if(i != j){
  93.                 t = m[j][i];
  94.                 for(int k = 0 ; k < 2 * n ; ++k){
  95.                     m[j][k] = m[j][k] - t * m[i][k];
  96.                 }
  97.             }
  98.         }
  99.     }
  100.     vector<vector<double>> res(n , vector<double>(n , 0.0));
  101.     for(int i = 0 ; i < n ; ++i){
  102.         for(int j = 0 ; j < n ; ++j){
  103.             res[i][j] = m[i][j + n];
  104.         }
  105.     }
  106.     return res;
  107. }
  108.  
  109. vector<vector<double>> Moore_Penrose(vector<vector<double>> & a , double eps){
  110.     vector<vector<double>> xt = Transpose(a);
  111.     vector<vector<double>> xxt = Multiply(xt , a);
  112.     vector<vector<double>> e(xxt.size() , vector<double>(xxt.size() , 0.0));
  113.     for(int i = 0 ; i < xxt.size() ; ++i){
  114.         e[i][i] = 1.0;
  115.     }
  116.     vector<vector<double>> ad = Add(xxt , e , eps);
  117.     vector<vector<double>> iad = Inverse(ad);
  118.     vector<vector<double>> res = Multiply(iad , xt);
  119.     return res;
  120. }
  121.  
  122. double norm(vector<vector<double>> & a){
  123.     double sum = 0.0;
  124.     for(int i = 0 ; i < a.size(); ++i){
  125.         for(int j = 0 ; j < a[i].size() ; ++j){
  126.             sum += pow(a[i][j] , 2);
  127.         }
  128.     }
  129.     return sum;
  130. }
  131.  
  132. vector<vector<double>> Solve_Moore_Penrose(vector<vector<double>> & a , vector<vector<double>> & b){//vector<vector<double>>
  133.     double best_norm = 1e9 , best_eps = 1e9;
  134.     vector<vector<double>> px;
  135.     for(int i = 10 ; i <= 100 ; i += 10){
  136.         double eps = (double)i / 100.0;
  137.         vector<vector<double>> aa = Moore_Penrose(a , eps);
  138.         vector<vector<double>> t = Multiply(b , aa);
  139.         vector<vector<double>> ta = Multiply(t , a);
  140.         vector<vector<double>> ck = Add(ta , b , -1.0);
  141.         double cur = norm(ck);
  142.         if(cur < best_norm){
  143.             best_norm = cur;
  144.             best_eps = eps;
  145.             px = aa;
  146.         }
  147.     }
  148.     vector<vector<double>> A = Multiply(b , px);
  149.     return Multiply(A , a);
  150. }
  151.  
  152.  
  153. vector<vector<double>> Greville(vector<vector<double>> & a){
  154.     vector<vector<double>> x(1 , vector<double>(a[0].size()));
  155.     x[0] = a[0];
  156.  
  157.     vector<vector<double>> tr = Transpose(x);
  158.     vector<vector<double>> div = Multiply(x , tr);
  159.     vector<vector<double>> pin = MultK(tr , div[0][0]);
  160.  
  161.     for(int i = 1 ; i < a.size() ; ++i){
  162.         vector<vector<double>> cur(1 , vector<double>(a[i].size()));
  163.         cur[0] = a[i];
  164.         vector<vector<double>> tcur = Transpose(cur);
  165.         vector<vector<double>> e(a[0].size() , vector<double>(a[0].size() , 0.0));
  166.         for(int j = 0 ; j < a[0].size() ; ++j){
  167.             e[j][j] = 1.0;
  168.         }
  169.         vector<vector<double>> su = Multiply(pin , x);
  170.         vector<vector<double>> z = Add(e , su , -1);
  171.         vector<vector<double>> ck = Multiply(cur , z);
  172.         ck = Multiply(ck , tcur);
  173.  
  174.         if(ck[0][0] > 1e-6){
  175.             double d = ck[0][0];
  176.             vector<vector<double>> fi = Multiply(z , tcur);
  177.             fi = Multiply(fi , cur);
  178.             fi = Multiply(fi , pin);
  179.             fi = MultK(fi , d);
  180.             fi = Add(pin , fi , -1);
  181.  
  182.             vector<vector<double>> se = Multiply(z , tcur);
  183.             se = MultK(se , d);
  184.  
  185.             pin = fi;
  186.             for(int j = 0 ; j < pin.size() ; ++j){
  187.                 pin[j].push_back(se[j][0]);
  188.             }
  189.         }else{
  190.             vector<vector<double>> tpin = Transpose(pin);
  191.             vector<vector<double>> r = Multiply(pin , tpin);
  192.             vector<vector<double>> ck2 = Multiply(cur , r);
  193.             ck2 = Multiply(ck , tcur);
  194.             double d = 1 + ck2[0][0];
  195.             vector<vector<double>> fi = Multiply(r , tcur);
  196.             fi = Multiply(fi , cur);
  197.             fi = Multiply(fi , pin);
  198.             fi = MultK(fi , d);
  199.             fi = Add(pin , fi , -1);
  200.  
  201.             vector<vector<double>> se = Multiply(r , tcur);
  202.             se = MultK(se , d);
  203.  
  204.             pin = fi;
  205.             for(int j = 0 ; j < pin.size() ; ++j){
  206.                 pin[j].push_back(se[j][0]);
  207.             }
  208.         }
  209.         x.push_back(a[i]);
  210.     }
  211.     return pin;
  212. }
  213.  
  214.  
  215. int round(double d){
  216.     double d1 = floor(d);
  217.     if(fabs(fabs(d) - fabs(d1)) - 0.5 >= 1e-7){
  218.         return max(0 , min((int)d + 1 , 255));
  219.     }
  220.     return max(0 , min((int)d , 255));
  221. }
  222.  
  223. int main( int argc, char** argv )
  224. {
  225. //  freopen("output.txt" , "w" , stdout);
  226.     cout.setf(ios::fixed);
  227.     cout.precision(14);
  228.     Mat X , Y;
  229.     X = imread("C:\\Users\\Max\\Downloads\\Lab_mat_model_student\\Lab2\\x1.bmp" , CV_LOAD_IMAGE_ANYDEPTH);
  230.     Y = imread("C:\\Users\\Max\\Downloads\\Lab_mat_model_student\\Lab2\\y8.bmp" , CV_LOAD_IMAGE_ANYDEPTH);
  231.     if(!X.data || !Y.data){
  232.         cout <<  "Could not open or find images" << endl;
  233.         system("pause");
  234.         return -1;
  235.     }
  236.    
  237.     vector<vector<double>> intensity_x = Intensity(X);
  238.     vector<vector<double>> intensity_y = Intensity(Y);
  239.  
  240.     intensity_x.push_back(vector<double>(intensity_x[0].size() , 1));
  241.  
  242.     vector<vector<double>> A = Solve_Moore_Penrose(intensity_x , intensity_y);
  243.  
  244.     Mat res_Moore_Penrose(A.size() , A[0].size() , CV_8UC1);
  245.  
  246.     for(int i = 0 ; i < A.size() ; ++i){
  247.         for(int j = 0 ; j < A[i].size() ; ++j){
  248.             res_Moore_Penrose.at<uchar>(i,j) = round(A[i][j]);
  249.         }
  250.     }
  251.  
  252.  
  253.     vector<vector<double>> Agr = Greville(intensity_x);
  254.     Agr = Multiply(intensity_y , Agr);
  255.     Agr = Multiply(Agr , intensity_x);
  256.  
  257.     Mat res_Greville(Agr.size() , Agr[0].size() , CV_8UC1);
  258.  
  259.     for(int i = 0 ; i < Agr.size() ; ++i){
  260.         for(int j = 0 ; j < Agr[i].size() ; ++j){
  261.             res_Greville.at<uchar>(i,j) = round(Agr[i][j]);
  262.         }
  263.     }
  264.     namedWindow("Moore_Penrose", WINDOW_AUTOSIZE);
  265.     imshow("Moore_Penrose", res_Moore_Penrose);
  266.     waitKey(0);
  267.     namedWindow("Greville", WINDOW_AUTOSIZE);
  268.     imshow("Greville", res_Greville);
  269.     waitKey(0);
  270.     system("pause");
  271.     return 0;
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement