基于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);

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

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

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

看起来有两个小问题:

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

对于第一个问题,有两个选项:

  1. 您可以使用:
    img = im2double(img)(给出与img = double(img)/255相同的结果(来代替img = double(img)
  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);

最新更新