一、卷积的概念以及计算
1.一维卷积
在泛函分析中,卷积是通过两个函数 f 和 g 生成第三个函数的数学运算,表征函数 f 和经过翻转,平移的g 的乘积函数围成的曲边梯形的面积。
连续函数卷积: 设 f(x),g(x) 是 R 上两个可积函数,作积分:
离散序列卷积: 设 f(m),g(n) 是长度为 N 的两个离散信号,它们的积分是:
卷积运算的应用相当广泛,比如多项式的乘法(包括整数的乘法), 其实就是在进行对两个离散序列进行卷积运算。在图像处理中,用作图像的边缘检测,图像模糊,锐化等等。在统计学中,加权的平滑是一种卷积。在概率论中,两个统计独立的变量 X,Y 的概率密度函数是 XY 概率密度函数的卷积。在信号处理的过程中,任何一个系统的输出都可以看成是输入信号和系统冲击响应的卷积。
2.二维卷积
计算公式为:
二、图像处理中的应用
1.计算实例
索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量,假设两个sobel因子为:
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:
2.方法汇总
关于二维卷积的运算,在网上看了较多的文章,给出的方法大多数翻转之类的,找到一篇链接,讲解的比较全。
整体的计算公式为:
需要注意的是:
即:
A、B表示g(x,y)的维数,M、N代表f(x,y)的维数。
下面是计算实例:
方法一:解析法
方法二:图解法
这也是网上讲解的最多的
方法三:多项式乘法
这是另一个博主的方法,详情见http://blog.sciencenet.cn/home.php?mod=space&uid=268138&do=blog&id=383185(仅供学习)
以下列矩阵为例:
则有:a和d的卷积就是,把a和d的第一行作为一个多项式的系数,按多项式升幂排列(也可以按降幂),即为:
结果为:
当然除了以上方法,还可以直接代入公式计算,以方法一中的例题为例,假设卷积后的矩阵为B,则有:
B(0,0)=G(0,0)F(0,0)+G(0,1)F(0,-1)+G(1,0)F(-1,0)+G(1,1)F(-1,-1)最后代入数值,需要注意的是F为周期性函数,G为卷积核,F为被卷机矩阵,那么F应被扩展为(m+n)维的方阵,m、n分别为G、F的维数,且这个矩阵多余的补0,最终计算的式子其实与方法二相同。
3.计算结果
回到正题中,根据上述提到的方法则有:
Gx =(-1)f(x-1, y-1) + 0f(x-1,y) + 1f(x-1,y+1) +(-2)f(x,y-1) + 0f(x,y)+2f(x,y+1) +(-1)f(x+1,y-1) + 0f(x+1,y) + 1f(x+1,y+1)= f(x-1,y+1)+2f(x,y+1)+f(x+1,y)-f(x-1, y-1)-2*f(x,y-1)-f(x+1,y-1)
Gy =1* f(x-1, y-1) + 2f(x-1,y)+ 1f(x,y+1) +0f(x,y-1)+ 0f(x,y) + 0*f(x,y+1) +(-1)f(x+1,y-1) + (-2)f(x+1,y-1) + (-1)f(x+1, y+1)= f(x-1, y-1) + 2f(x-1,y)+ 1f(x,y+1)-f(x+1,y-1)-2f(x+1,y-1) -f(x+1, y+1)
这里我与另外一位博主的计算结果有点不同,当然这里我是没有翻转,因为反转之后只是符号变了,而且是全部变了,而后面的计算是有平方的,因此不用翻转也是可以的,翻转了是更准确地解法,这一篇博客地址是(https://blog.csdn.net/qq_29238153/article/details/80822267),但是这里我是非常疑惑地,他的计算也是可以得到相同的效果的,但是我觉得自己的计算过程是没有问题的,因为符合计算公式和方法,仔细看了下应该是写反了,把Gy的结果写成了Gx的结果。
因此,图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:
三、MATLAB实现
f = imread('D:\GG\6c2a0008d4bf2b6df897.jpg');
f=rgb2gray(f);
n=input('请输入均值滤波模板大小:');
% tem=ones(n);
[hight,width]=size(f);
x1=double(f);x2=double(f);
for i=1:hight-n+1
for j=1:width-n+1
a=x1(i:i+n-1,j:j+n-1);
B =sort( a(:));
suma=sum((a(:)).^2);
x1(i+(n-1)/2,j+(n-1)/2)=sqrt(suma/(n*n));
x2(i+(n-1)/2,j+(n-1)/2)=median(B);
end
end
uSobel = f;
for i = 2:hight - 1 %sobel边缘检测
for j = 2:width - 1
Gx = (x1(i-1,j-1) - x1(i-1,j+1) + 2*x1(i,j-1)) - 2*x1(i,j+1) + x1(i+1,j-1) - x1(i+1,j+1);%不翻转
% Gx = (-x1(i-1,j-1) + x1(i-1,j+1) - 2*x1(i,j-1)) + 2*x1(i,j+1) - x1(i+1,j-1) + x1(i+1,j+1);%翻转
Gy = (-x1(i-1,j-1) - 2*x1(i-1,j) - x1(i-1,j+1)) +x1(i+1,j-1) + 2*x1(i+1,j) + x1(i+1,j+1);%不翻转
% Gy = (x1(i-1,j-1) + 2*x1(i-1,j) + x1(i-1,j+1)) -x1(i+1,j-1) - 2*x1(i+1,j) - x1(i+1,j+1);%翻转
uSobel(i,j) = sqrt(Gx^2 + Gy^2);
end
end
g = uint8(x1);
z = uint8(x2);
uSobel = uint8(uSobel);
subplot(1,4,1);
imshow(g);
title('均值滤波图像');
subplot(1,4,2);
imshow(f);
title('原图');
subplot(1,4,3);
imshow(z);
title('中值滤波图像');
subplot(1,4,4);
BW3 = edge(f,'Sobel', 0.02);
imshow(BW3);
title('边缘检测');
figure(2);
imshow(uSobel );
最后可得sobel边缘提取的图像为:
另一幅车牌图为:
提取效果良好。
参考文献
1.卷积运算 Convolution (f ∗ g)(x)
2.sobel边缘检测