在Matlab上通过高斯系数对图像进行卷积

Convolution of image by Gaussian Coefficient on Matlab

clc;
clear all;
clc;

img = imread ('a.jpg');

img = rgb2gray(img);
figure, imshow(img);

img = double (img);

sigma= 2;
G= zeros(5,5);
for i=1:5
    for j=1:5
        x=[-2,1,0,-1,2];
        y=[-2,1,0,-1,2];
        G(i,j)= exp(-(x(i)^2+y(j)^2)/(2*(sigma^2)));
    end
end

G_=G/sum(sum(G,1),2);

A= conv2(img,G);

figure, imshow(A);

这是我的图像平滑代码。 我首先计算了归一化的高斯滤波器系数

对于最后一行,我尝试通过高斯滤波器系数对图像进行卷积,然后显示图像。 但是,它只显示一个白色的空图像。 我认为高斯滤波器系数的值是正确的,所以我认为问题出在卷积上。

conv2(u,v)不是在matlab上做的卷积吗?我做错了什么?

貌似有两个小问题:

  • img = double(img) 将图像类型从 uint8 转换为 double
    在 MATLAB 中,double 类型的图像应用像素范围 [0, 1].
    1以上的所有像素都是白色的,所以显示的图像是白色的。
  • 您在 conv2 中使用的内核未规范化。
    当您想使用时,您正在使用 A = conv2(img, G)A = conv2(img, G_).

第一期有两种选择:

  1. 代替img = double(img),您可以使用:
    img = im2double(img)(给出与 img = double(img)/255 相同的结果)。
  2. 保留img = double(img),但在imshow(A)之前转换为uint8
    imshow(uint8(A)).

这是更正代码的(选项之一):

clc
clear all

img = imread('a.jpg');

img = rgb2gray(img);
figure, imshow(img);

img = im2double(img); % im2double(img) instead of double(img).

sigma = 2;
G = zeros(5,5);
for i = 1:5
    for j = 1:5
        x = [-2,1,0,-1,2];
        y = [-2,1,0,-1,2];
        G(i,j) = exp(-(x(i)^2+y(j)^2)/(2*(sigma^2)));
    end
end

G_ = G/sum(sum(G,1),2);

A = conv2(img, G_); % G_ instead of G. For better margins: A = conv2(img, G_, 'same');

figure, imshow(A);