Matlab/Octave 中的二维卷积

2D convolution in Matlab/Octave

I = imread ("lena.jpg");
%imshow(I);
K = I;
C = conv2(I, K);
imshow(C);

我期待 .

中指出的类似以下内容

但是,我的八度输出是空白的:

可能是什么原因?

以及,我怎样才能获得预期的输出?

imshow() 期望值介于 [0-255] 之间。在你的卷积之后,你所有的值都远高于 255。所以当然当你使用 imshow(C)、matlab/octave 时使用 uint8() 进行类型转换。您所有的值都等于 255,结果是白色图像。 (0 = 黑色,255 = 白色)。

您还应该考虑以下几点:

  1. 将选项 'same' 添加到卷积以保留图像的原始大小:conv2(I,K,'same')

  2. 如果你只应用这样的卷积,你会得到很强的边界效果,因为你的图像的中心值比图像边界的值乘以更多的时间。您应该添加一个补偿矩阵:

    border_compensation = conv2(ones(size(K)),ones(size(K)),'same') C = conv2(I,K,'same')./border_compensation

  3. 归一化最终结果(不要考虑第2点。如果你真的想要你在问题中指出的那种输出)

    C = uint8(C/max(C(:))*255)