数字图像卷积原理,matlab的conv2函数,不使用con2函数实现卷积
图像卷积原理
卷积,Convolution。卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n),则卷积的结果为:
本文只讨论卷积在数字图像中的应用。
数字图像是二维离散信号,对图像进行卷积操作就是卷积模板在图像上滑动,如下图所示。
滑动的过程中,图像像素值和模板像素值对应位置相乘再相加得到的结果就是中心元素对应的卷积结果。比如在上图中,图像中原像素值为6(第二行第二列)卷积后得结果得到-3。
MATLAB函数conv2
首先可以通过lookfor convolution
查看matlab所提供的卷积操作。
可以看到二维卷积函数是conv2,然后通过help conv2
打开帮助文档,查看具体的conv2函数。
举例:
%% 图像卷积
clc,clear
I = imread('lenna1.jpg');
[M,N] = size(I);%获取原始图像大小
I = double(I);
%% conv2函数实现卷积
M1 = 1/9 * [1 1 1;1 1 1;1 1 1];% 3×3 邻域平均线性平滑滤波
I1 = conv2(I,M1,'same');
I2 = conv2(I,M1);
figure(1);
subplot(1,3,1);imshow(uint8(I));title('原图像');
subplot(1,3,2);imshow(uint8(I1));title('conv2函数实现卷积,与I大小相同的卷积');
subplot(1,3,3);imshow(uint8(I2));title('conv2函数实现卷积,完整卷积');
I为原图像,I1为卷积大小与I相同的卷积区域,I2为完全卷积区域。
通过查看具体I、I1、I2的数值,可以发现conv2在卷积时对于图像边缘的处理是补0处理。
MATLAB实现图像卷积
这里卷积模板使用了线性平滑滤波中最简单的邻域平均卷积模板,对于边缘的进行了忽略处理(即只选择了对应模板元素都在图像矩阵中的像素进行卷积)。
%% 图像卷积
clc,clear
I = imread('lenna1.jpg');
[M,N] = size(I);%获取原始图像大小
I = double(I);
%% conv2函数实现卷积
M1 = 1/9 * [1 1 1;1 1 1;1 1 1];% 3×3 邻域平均线性平滑滤波
I1 = conv2(I,M1,'same');
I2 = conv2(I,M1);
figure(1);
subplot(1,3,1);imshow(uint8(I));title('原图像');
subplot(1,3,2);imshow(uint8(I1));title('conv2函数实现卷积,与I大小相同的卷积');
subplot(1,3,3);imshow(uint8(I2));title('conv2函数实现卷积,完整卷积');
%% 不使用conv2函数进行卷积
M2 = 1/9 * [1 1 1;1 1 1;1 1 1];% 3×3 邻域平均线性平滑滤波
n = size(M2,1);
t = floor(n/2);
I3 = zeros(M,N);
%边缘没有进行卷积
for i = 1+t:M-t
for j = 1+t:N-t
I3(i,j) = sum(sum(M1 .* I(i-t:i+t,j-t:j+t)));
end
end
figure(2);
subplot(1,3,1);imshow(uint8(I));title('原图像');
subplot(1,3,2);imshow(uint8(I1));title('conv2函数实现卷积,与I大小相同的卷积');
subplot(1,3,3);imshow(uint8(I3));title('不使用conv2函数进行卷积');
可看到I3的边缘都是0。