在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_)
.
第一期有两种选择:
- 代替
img = double(img)
,您可以使用:
img = im2double(img)
(给出与 img = double(img)/255
相同的结果)。
- 保留
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);
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_)
.
第一期有两种选择:
- 代替
img = double(img)
,您可以使用:
img = im2double(img)
(给出与img = double(img)/255
相同的结果)。 - 保留
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);