Haar小波结果有点奇怪

时间:2018-12-04 10:54:16

标签: javascript opencv image-processing wavelet haar-wavelet

我正在尝试实现haar小波变换,但是我发现了一个问题。结果是正确的,但是出了点问题。

这是我的代码的输出,请看一下Result

这是我的代码

       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=createArray(height,width);
  var rowSize = width;
  var colSize = height;
  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] = Math.max(0,Math.min(pixel[i],255));
     };
   };
 };

  //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] = Math.max(0,Math.min(Haar[row][col][i] , 255));
            };

            OneDHaarTransform(tempHaar);

            for(col = 0; col < currWidth; col++) {
              Haar[row][col][i] = Math.max(0,Math.min(tempHaar[col],255));
            };
          };
        };
      };
      //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] = Math.max(0,Math.min(Haar[row][col][i],255));
            };

            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++) {

      let pixel=dst.ucharPtr(row,col);
      pixel[0] = Math.max(0,Math.min(255,Haar[row][col][0]));
      pixel[1] = Math.max(0,Math.min(255,Haar[row][col][1]));
      pixel[2] = Math.max(0,Math.min(255,Haar[row][col][2]));

    };
  };
  cv.normalize(dst,dst,0,255,cv.NORM_MINMAX,cv.CV_8UC1);
  cv.imshow('canvasOutput', dst);
  pix.delete();dst.delete();
}; 

我猜图像输出有点白??仍然不确定 有什么我想念的吗? 任何帮助表示赞赏:)

0 个答案:

没有答案