Вейвлет-хаар цвета результата испорчены - PullRequest
0 голосов
/ 03 декабря 2018

Я попытался настроить этот код вейвлет-преобразования Хаара для работы с OpenCV.js.Рекурсия работает нормально, но цвета получающегося изображения перепутаны.Вот скриншот моих результатов: enter image description here

Вот как должен выглядеть результат: enter image description here

И вот мой код:

function OneDHaarTransform(HaarMatrix) 
{
  var sum = 0;
  var diff = 0;
  var hMLen = HaarMatrix.length/2;
  var tempHaar = [];
  //It only recurses on first half of the array
  for (var i = 0; i < hMLen; i++) 
  {
    sum = HaarMatrix[2*i] + HaarMatrix[2*i + 1];
    sum = sum / Math.sqrt(2);
    diff = HaarMatrix[2*i] - HaarMatrix[2*i + 1];
    diff = diff / Math.sqrt(2);
    tempHaar[i] = sum;
    tempHaar[i + hMLen] = diff
  };
  for (var i = 0; i < HaarMatrix.length; i++) {
    HaarMatrix[i] = tempHaar[i];
  };
};

function haarTransform(img, MaxStepHaar) 
{
  var width = img.cols;
  var height = img.rows;
  var currWidth = width;
  var currHeight = height;
  let pix=img.clone();
  let altpix=[];
  var rowSize = width;
  var colSize = height;
  // var Haar = [];
  var Haar = createArray(height,width,3);
  var tempHaar = [];
  let dst = img.clone();

  //Initialize the Haar matrix
  for (var row = 0; row < height; row++) 
  {
    for (var col = 0; col < width; col++) {
      for (var i = 0; i < 3; i++) {
       let pixel = pix.ucharPtr(row,col);
       Haar[row][col][i] = pixel[i];
     };
   };
 };

  //Do a Haar Wavelet Transform
  while( (currWidth > 1 || currHeight > 1) && (MaxStepHaar > 1) ) 
  {
    MaxStepHaar = MaxStepHaar - 1;

      //Do it for each row first
      if (currWidth > 1) 
      {
        for(var row = 0; row < currHeight; row++)
        {
          for (var i = 0; i < 3; i++) {
            for(col = 0; col < currWidth; col++) {
              tempHaar[col] = Haar[row][col][i];
            };

            OneDHaarTransform(tempHaar);

            for(col = 0; col < currWidth; col++) {
              Haar[row][col][i] = tempHaar[col];
            };
          };
        };
      };
      //Then perform Haar transform on each column
      tempHaar = [];
      if (currHeight > 1) 
      {
        for(var col = 0; col < currWidth; col++)
        {
          for (var i = 0; i < 3; i++) {
            for(row = 0; row < currHeight; row++) {
              tempHaar[row] = Haar[row][col][i];
            };

            OneDHaarTransform(tempHaar);

            for(row = 0; row < currHeight; row++) {
              Haar[row][col][i] = tempHaar[row];
            };
          };
        };
      };
      tempHaar = [];

      if (currHeight > 1) {currHeight  = currHeight/2};
      if (currWidth > 1)  {currWidth = currWidth/2};
    };
  //Copy pix data to canvas
  for (var row = 0; row < height; row++) {
    for (var col = 0; col < width; col++) {
      pixel[0] = Haar[row][col][0];
      pixel[1] = Haar[row][col][1];
      pixel[2] = Haar[row][col][2];
      pixel[3] = 1;
    };
  };
  pix.delete();dst.delete();
};

Я только изменил его, чтобы вход и выход были объектами Mat ().Я пытался увидеть, превышает ли максимальное значение Mat () 255, но это не так.Я не знаю, что пошло не так, пожалуйста, помогите.

...