2d卷积函数的输出错误

时间:2017-10-31 17:11:07

标签: matlab matlab-figure

正如标题所说,我从这个函数中得到的输出是不正确的。不正确我的意思是数据溢出。如何正确标准化矩阵?目前,我得到的几乎所有照片都是白色的。

我从另一个MATLAB文件中调用了这个函数:

mask = [3,10,3;0,0,0;-3,-10,-3];
A = imread(“football.jpg”);
B = ConvFun(A,mask);

function [ image ] = ConvFun( img,matrix )
  [rows,cols] = size(img); %// Change

  %// New - Create a padded matrix that is the same class as the input
  new_img = zeros(rows+2,cols+2);
  new_img = cast(new_img, class(img));

  %// New -  Place original image in padded result
  new_img(2:end-1,2:end-1) = img;

  %// Also create new output image the same size as the padded result
  image = zeros(size(new_img));
  image = cast(image, class(img));

  for i=2:1:rows+1 %// Change
      for j=2:1:cols+1 %// Change
          value=0;
          for g=-1:1:1
              for l=-1:1:1
                  value=value+new_img(i+g,j+l)*matrix(g+2,l+2); %// Change
              end
          end
          image(i,j)=value;
      end
  end

  %// Change
  %// Crop the image and remove the extra border pixels
  image = image(2:end-1,2:end-1);
  imshow(image)
end

1 个答案:

答案 0 :(得分:1)

在卷积中,如果您希望像素值保持在相同的范围内 ,你需要使掩码加起来1.在定义掩码后,只需将掩码除以sum(mask(:))。但是,这不是你要处理的情况。

有时这不是必需的。例如,如果您正在进行边缘检测(如您显示的内核),则您并不真正关心维护像素值。在这些情况下,非标准化图像的绘图更是问题。您始终可以将imshow功能设置为自动选择显示范围:imshow(image,[])

另外,我希望这是作业,因为这是编码卷积的最糟糕的方法。基于FFT的卷积一般快100倍,MATLAB内置了它。