正如标题所说,我从这个函数中得到的输出是不正确的。不正确我的意思是数据溢出。如何正确标准化矩阵?目前,我得到的几乎所有照片都是白色的。
我从另一个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
答案 0 :(得分:1)
在卷积中,如果您希望像素值保持在相同的范围内
,你需要使掩码加起来1.在定义掩码后,只需将掩码除以sum(mask(:))
。但是,这不是你要处理的情况。
有时这不是必需的。例如,如果您正在进行边缘检测(如您显示的内核),则您并不真正关心维护像素值。在这些情况下,非标准化图像的绘图更是问题。您始终可以将imshow
功能设置为自动选择显示范围:imshow(image,[])
。
另外,我希望这是作业,因为这是编码卷积的最糟糕的方法。基于FFT的卷积一般快100倍,MATLAB内置了它。