首先在网上搜索了什么是sobel:
一、先是理解一下什么是卷积
最容易理解的对卷积(convolution)的解释
文字来解释就是:卷积的其中一方参与者是冲击响应,它所描述的的曲线方向与时间流逝一致。而卷积的输出等于以前的信号效果累加,这个累加必然从当前时间点逆时间流逝方向进行的。很显然,离当前时间越近,那个输入残留在系统中的回响就越大。
转自知乎
再说说自己对卷积公式的理解,也是每次自己容易困惑的地方:注意公式中的n才是自变量(意义便是n时刻的系统响应),t只是用于积分的,f(n-t)是n时刻时往回倒t单位时间时,也就是(n-t)时刻的信号输入,而h(t)则是f()这个信号对于时间的变化,所以将n时刻前的每个时间的信号输入与其对应的对于时间变化的响应相乘(结合上面图片理解),把这些结果叠加起来就是n时刻获得的响应。
二、然后是对图像处理中的卷积,涉及到一些矩阵的东西
ps:虽然上面对卷积的理解解开了以前一直以来对卷积的困惑,不过在看图像处理中的卷积时感觉好像不一样。。。
关于下面这个文章:
彻底理解数字图像处理中的卷积-以Sobel算子为例
这篇文章前面的概念部分讲得很详细,对几个名词解释也通俗易懂(感觉就是矩阵元素的对应相乘),只是没说sobel算子的gx和gy的具体用法,所以还是不知道这个算法的意义和用处。。。
好在下面这篇文章对sobel的用法和用处有一定的解绍,让我大致理解了sobel的概念
https://www.cnblogs.com/sophia-hxw/p/6088035.html
也大概知道gx和gy对于结果的差别,举个例子:比如原图是一个方框,用gx计算了垂直梯度后,由于只反映纵向的梯度差异,结果显示出来就只有原来的两条水平的边,相反,如果是用gy计算了水平梯度,由于只反映横向的梯度差,原来的两条垂直边就被反映出来,而水平边因为水平方向上的梯度值都一样就显示不出梯度差。
三、使用halcon中的sobel_amp函数及一系列操作完成图像边缘检测
参考如下链接
Halcon学习(八)边缘检测(一)
不禁感慨,halcon真是简单粗暴啊
关于sobel_amp(Image : EdgeAmplitude : FilterType, Size : )这个函数
read_image (Image, 'fabrik')
sobel_amp (Image, EdgeAmplitude, 'y', 3)
sobel_amp (Image, EdgeAmplitude, 'x', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_sqrt', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_sqrt_binomial', 3)
sobel_amp (Image, EdgeAmplitude, 'x_binomial', 3)
sobel_amp (Image, EdgeAmplitude, 'y_binomial', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_abs_binomial', 3)
*sobel_amp (Image, EdgeAmplitude, '', 3)
*sobel_amp (Image, EdgeAmplitude, '', 3)
dev_display (EdgeAmplitude)
试了各种FilterType参数,有不同的效果,具体的用处还不知道。
read_image (Image, 'fabrik')
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 5)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 7)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 9)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 11)
dev_display (EdgeAmplitude)
然后是size参数,效果应该是值越大,筛选的线越粗,很多细节就被忽略了,值越小就能体现更多细节,具体用法应该是根据实际情况。根据FilterType选择的不同,size的值的可选数值也不同,可以参考halcon里的函数解释。