Facebook
From Little Madrill, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 310
  1. #include "opencv2/core/core.hpp"
  2. #include "opencv2/highgui/highgui.hpp"
  3. #include <iostream>
  4.  
  5. cv::Mat& perform(cv::Mat& I){
  6.   CV_Assert(I.depth() != sizeof(uchar));
  7.   switch(I.channels())  {
  8.   case 1:
  9.     for( int i = 0; i < I.rows; ++i)
  10.         for( int j = 0; j < I.cols; ++j )
  11.             I.at<uchar>(i,j) = (I.at<uchar>(i,j)/32)*32;
  12.     break;
  13.   case 3:
  14.     cv::Mat_<cv::Vec3b> _I = I;
  15.     for( int i = 0; i < I.rows; ++i)
  16.         for( int j = 0; j < I.cols; ++j ){
  17.             _I(i,j)[0] = (_I(i,j)[0]/32)*32;
  18.             _I(i,j)[1] = (_I(i,j)[1]/32)*32;
  19.             _I(i,j)[2] = (_I(i,j)[2]/32)*32;
  20.         }
  21.     I = _I;
  22.     break;
  23.   }
  24.   return I;
  25. }
  26.  
  27. uchar cutToRange(int value){
  28.         if (value > 255)
  29.                 value = 255;
  30.         if (value < 0)
  31.                 value = 0;
  32.         return (uchar)value;
  33. }
  34.  
  35. cv::Mat& substractRed(cv::Mat& I){
  36.         CV_Assert(I.depth() != sizeof(uchar));
  37.         switch (I.channels())  {
  38.         case 1:
  39.                 break;
  40.         case 3:
  41.                 cv::Mat_<cv::Vec3b> _I = I;
  42.                 for (int i = 0; i < I.rows; ++i)
  43.                         for (int j = 0; j < I.cols; ++j){
  44.                         int brightness = _I(i, j)[0] - (_I(i, j)[0] + _I(i, j)[1] + _I(i, j)[2]) / 3;
  45.                         _I(i, j)[0] = cutToRange((int)_I(i, j)[2] - brightness);
  46.                         _I(i, j)[1] = cutToRange((int)_I(i, j)[2] - brightness);
  47.                         _I(i, j)[2] = cutToRange((int)_I(i, j)[2] - brightness);
  48.                         }
  49.                 I = _I;
  50.                 break;
  51.         }
  52.         return I;
  53. }
  54.  
  55.  
  56.  
  57. cv::Mat& changeBrightness(cv::Mat& I, int changeValue){
  58.         CV_Assert(changeValue <= 100 && changeValue >= -100);
  59.         switch (I.channels())  {
  60.         case 1:
  61.                 break;
  62.         case 3:
  63.                 cv::Mat_<cv::Vec3b> _I = I;
  64.                 for (int i = 0; i < I.rows; ++i)
  65.                         for (int j = 0; j < I.cols; ++j){
  66.                         _I(i, j)[0] = cutToRange((int)_I(i, j)[0] + changeValue);
  67.                         _I(i, j)[1] = cutToRange((int)_I(i, j)[1] + changeValue);
  68.                         _I(i, j)[2] = cutToRange((int)_I(i, j)[2] + changeValue);
  69.                         }
  70.                 I = _I;
  71.                 break;
  72.         }
  73.         return I;
  74. }
  75.  
  76. cv::Mat& changeContrast(cv::Mat& I, int changeValue){
  77.         CV_Assert(changeValue <= 100 && changeValue >= -100);
  78.         switch (I.channels())  {
  79.         case 1:
  80.                 break;
  81.         case 3:
  82.                 cv::Mat_<cv::Vec3b> _I = I;
  83.                 for (int i = 0; i < I.rows; ++i)
  84.                         for (int j = 0; j < I.cols; ++j){
  85.                         _I(i, j)[0] = cutToRange((int)_I(i, j)[0] * (1 + changeValue / 100));
  86.                         _I(i, j)[1] = cutToRange((int)_I(i, j)[1] * (1 + changeValue / 100));
  87.                         _I(i, j)[2] = cutToRange((int)_I(i, j)[2] * (1 + changeValue / 100));
  88.                         }
  89.                 I = _I;
  90.                 break;
  91.         }
  92.         return I;
  93. }
  94.  
  95. cv::Mat selectMax(cv::Mat& I){
  96.     CV_Assert(I.depth() != sizeof(uchar));
  97.     cv::Mat  res(I.rows,I.cols, CV_8UC3);
  98.     switch(I.channels())  {
  99.     case 3:
  100.         cv::Mat_<cv::Vec3b> _I = I;
  101.         cv::Mat_<cv::Vec3b> _R = res;
  102.         for( int i = 0; i < I.rows; ++i)
  103.             for( int j = 0; j < I.cols; ++j ){
  104.                 int sel = (_I(i,j)[0] < _I(i,j)[1])?1:0;
  105.                 sel = _I(i,j)[sel] < _I(i,j)[2]?2:sel;
  106.                 _R(i,j)[0] = sel==0?255:0;
  107.                 _R(i,j)[1] = sel==1?255:0;
  108.                 _R(i,j)[2] = sel==2?255:0;
  109.             }
  110.         res = _R;
  111.         break;
  112.     }
  113.     return res;
  114. }
  115.  
  116. cv::Mat shallowCopy(cv::Mat& I){
  117.         CV_Assert(I.depth() != sizeof(uchar));
  118.         cv::Mat  res(I.rows, I.cols, CV_8UC3);
  119.         switch (I.channels())  {
  120.         case 3:
  121.                 cv::Mat_<cv::Vec3b> _I = I;
  122.                 cv::Mat_<cv::Vec3b> _R = res;
  123.                 for (int i = 0; i < I.rows; ++i)
  124.                         for (int j = 0; j < I.cols; ++j){
  125.                         _R(i, j)[0] = _I(i, j)[0];
  126.                         _R(i, j)[1] = _I(i, j)[1];
  127.                         _R(i, j)[2] = _I(i, j)[2];
  128.                         }
  129.                 res = _R;
  130.                 break;
  131.         }
  132.         return res;
  133. }
  134.  
  135.  
  136. cv::Vec3b determinePixelValueByConv(cv::Mat& neigbourhood, int edgeValue){
  137.         int coeffs1[3][3] = { { -1, -1, -1 }, { -1, 9, -1 }, { -1, -1, -1 } };
  138.         int coeffs2[3][3] = { { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 } };
  139.         float coeffs1sum = 1.;
  140.         float coeffs2sum = 9.;
  141.         cv::Mat_<cv::Vec3b> _neigbourhood = neigbourhood;
  142.         cv::Vec3b centralPixel = _neigbourhood(1, 1);
  143.         cv::Vec3b outputPixel = cv::Vec3b();
  144.         if ((centralPixel[0] + centralPixel[1] + centralPixel[2])/3 < edgeValue){
  145.                 for (int k = 0; k < 3; k++){
  146.                         int product_sum = 0;
  147.                         for (int i = 0; i < _neigbourhood.rows; ++i){
  148.                                 for (int j = 0; j < _neigbourhood.cols; ++j){
  149.                                         product_sum += (_neigbourhood(i, j)[k] * coeffs1[i][j]);
  150.                                 }
  151.                         }
  152.                         outputPixel[k] = cutToRange((int)(product_sum / coeffs1sum));
  153.                 }
  154.         }
  155.  
  156.         else{
  157.                 for (int k = 0; k < 3; k++){
  158.                         float coeffs_sum = 0;
  159.                         int product_sum = 0;
  160.                         for (int i = 0; i < _neigbourhood.rows; ++i){
  161.                                 for (int j = 0; j < _neigbourhood.cols; ++j){
  162.                                         product_sum += (_neigbourhood(i, j)[k] * coeffs2[i][j]);
  163.                                         coeffs_sum += coeffs2[i][j];
  164.                                 }
  165.                         }
  166.                         outputPixel[k] = cutToRange((int)(product_sum / coeffs2sum));
  167.                 }
  168.         }
  169.         return outputPixel;
  170.  
  171. }
  172.  
  173.  
  174.  
  175. cv::Mat specialConv(cv::Mat& I, int edgeValue){
  176.         cv::Mat imageCopy = shallowCopy(I);
  177.         cv::Mat_<cv::Vec3b> _I = I;
  178.  
  179.         for (int i = 1; i < I.rows-2; i++){
  180.                 for (int j = 1; j < I.cols-2; j++){
  181.                         cv::Mat neigbourhood = imageCopy(cv::Rect(j - 1, i - 1, 3, 3));
  182.                         cv::Vec3b outputPixel = determinePixelValueByConv(neigbourhood, edgeValue);
  183.                         _I(i, j)[0] = outputPixel[0];
  184.                         _I(i, j)[1] = outputPixel[1];
  185.                         _I(i, j)[2] = outputPixel[2];  
  186.                 }
  187.         }
  188.         I = _I;
  189.         return I;
  190.  
  191. }
  192.  
  193.  
  194. void printHistogram(cv::Mat& I){
  195.         cv::Mat_<cv::Vec3b> _I = I;
  196.         int histTable[8] = {};
  197.         for (int i = 0; i < I.rows; ++i)
  198.                 for (int j = 0; j < I.cols; ++j){
  199.                         int basket = (_I(i, j)[0] + _I(i, j)[1] + _I(i, j)[2]) / (3 * 32);
  200.                         histTable[basket] += 1;
  201.                 }
  202.         for (int i = 0; i < 8; i++){
  203.                 std::cout << histTable[i];
  204.                 std::cout << " ";
  205.         }
  206. }
  207.  
  208. int main(int, char *[]) {
  209.     std::cout << "Start ..." << std::endl;
  210.     cv::Mat image = cv::imread("Lena.png");
  211.  
  212.     //cv::Mat max = selectMax(image);
  213.        
  214.     cv::imshow("Lena",image);
  215.         cv::Mat image2 = specialConv(image, 255);
  216.         cv::imshow("Lena2", image2);
  217.     //cv::imshow("Max",max);
  218.     //std::cout << image2.isContinuous() << max.isContinuous() << std::endl;
  219.     //cv::imwrite("Max.png",max);
  220.     cv::waitKey(-1);
  221.     return 0;
  222. }
  223.