【问题标题】:Convolution Error in MATLABMATLAB 中的卷积错误
【发布时间】:2017-02-21 18:47:42
【问题描述】:

我不知道为什么我在运行以下代码时没有得到与“ada.jpg”相同的图像:

clear;
I = rgb2gray(imread('ada.jpg'));
figure(1)
imshow(I)
M = int8([0 0 0 ; 0 1 0 ; 0 0 0]);
C = convn(M, I);
figure(2)
imshow(C)

这里有两张图片: input image - figure (1)output image - figure (2)

【问题讨论】:

    标签: matlab image-processing 2d convolution


    【解决方案1】:

    问题是您的输入图像数据I 的值介于0255 之间,并且数据类型为uint8。卷积后,输出为double,其值仍介于0255 之间。

    当输入为double 类型时,imshow 的默认值是缩放色轴,使0 为黑色,1 为白色。您的图像几乎完全显示为白色,因为您的大多数值都是>1

    要解决此问题(因为您需要将0 限制为255),您可以指定用作imshow 的第二个输入的值范围

    imshow(C, [0 255])
    

    或者您可以只提供一个空数组作为第二个输入,以便颜色自动缩放到输入图像的极值

    imshow(C, [])
    

    附带说明,您可以使用conv2 而不是convn,因为您只是在执行二维卷积。 conv2 要求所有输入都是浮点数,因此我们首先将 MI 转换为 double

    C = conv2(double(I), double(M), 'same');
    

    或者,如果您有图像处理工具箱(正如@rayryeng 建议的那样),您可以使用imfilter,而不必担心将MI 转换为double

    C = imfilter(I, M);
    

    【讨论】:

    • 成功了,谢谢!但我想知道,为什么 conv 函数不使用 uint8 数据类型而不是 double ?还是有为此目的的特殊功能?
    • @Burak conv2 只接受 doublesingle 类型的数据。它在文档中提到。这就是 Suever 将数据转换为 double 的原因。如果你有图像处理工具箱,你可以使用imfilter,它接受几乎所有类型的输入。
    • @rayryeng 我知道,请阅读 conv 功能的帮助菜单。我问为什么?有什么特殊原因吗?
    • @Burak 这是因为conv2 通常对内核和图像进行傅里叶变换,然后执行逐元素乘法,然后执行二维傅里叶逆变换。要进行这些操作,需要两者都是浮点数。 imfilter 是一个更高级别的函数,可以为您执行这些转换。
    • @Suever 谢谢!
    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2020-06-07
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多