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 = 白色)。
您还应该考虑以下几点:
将选项 'same' 添加到卷积以保留图像的原始大小:conv2(I,K,'same')
如果你只应用这样的卷积,你会得到很强的边界效果,因为你的图像的中心值比图像边界的值乘以更多的时间。您应该添加一个补偿矩阵:
border_compensation = conv2(ones(size(K)),ones(size(K)),'same')
C = conv2(I,K,'same')./border_compensation
归一化最终结果(不要考虑第2点。如果你真的想要你在问题中指出的那种输出)
C = uint8(C/max(C(:))*255)
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 = 白色)。
您还应该考虑以下几点:
将选项 'same' 添加到卷积以保留图像的原始大小:
conv2(I,K,'same')
如果你只应用这样的卷积,你会得到很强的边界效果,因为你的图像的中心值比图像边界的值乘以更多的时间。您应该添加一个补偿矩阵:
border_compensation = conv2(ones(size(K)),ones(size(K)),'same') C = conv2(I,K,'same')./border_compensation
归一化最终结果(不要考虑第2点。如果你真的想要你在问题中指出的那种输出)
C = uint8(C/max(C(:))*255)