关于图像处理中的卷积运算——sobel边缘检测

2 篇文章 0 订阅
1 篇文章 0 订阅

一、卷积的概念以及计算

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边缘检测

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值