设置首页收藏本站
开启左侧

derivate_gauss算子数学原理

[复制链接]
孤岛125 发表于 2023-8-14 17:24:45 | 显示全部楼层 |阅读模式
有没有大神清楚这个derivate_gauss算子背后的数学原理啊,主要是'gradient'和'2nd_ddg'这两个,全网找不到能清楚说清楚的帖子
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Criss 发表于 2023-8-15 11:48:03 | 显示全部楼层
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zjjdsg 发表于 2023-8-15 12:50:43 | 显示全部楼层
derivate_gauss是halocn库中实现高斯微分的函数。它可以对图像进行高斯微分操作。

在 halocn 的derivate_gauss函数中,sigma参数表示用于高斯平滑的高斯核的标准差。

标准差sigma控制着高斯平滑的程度:

sigma越大,高斯核越宽,得到的图像越平滑。

sigma越小,高斯核越窄,平滑效果弱。

默认情况下,sigma会根据ksize自动计算。一般来说,ksize越大,需要的sigma也越大。

我们也可以直接设置sigma的值,来手动控制平滑效果。一般设置规则:

sigma在0.5到1之间,平滑效果较轻。

sigma在1到2之间,适度平滑。

sigma大于2,平滑效果强。

所以调整sigma参数可以控制高斯微分的平滑程度。sigma较小时保留更多细节,较大时抑制更多噪声。需要根据图像内容和任务需求选择合适的sigma。
在halocn的derivate_gauss函数中,component参数用于指定计算那个方向的图像梯度。

component可选的值有:

0:只计算x方向上的梯度,即图像的竖直梯度。

1:只计算y方向上的梯度,即图像的水平梯度。

None:同时计算x和y方向的梯度,这是默认值。

然后component里不同的值代表的不同的算法
以上内容来自ai
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zjjdsg 发表于 2023-8-15 12:58:48 | 显示全部楼层
zjjdsg 发表于 2023-8-15 12:50
derivate_gauss是halocn库中实现高斯微分的函数。它可以对图像进行高斯微分操作。

在 halocn 的derivate_g ...

在 halocn 的 derivate_gauss 函数中,当 component 参数设置为 "2nd_ddg" 时,表示计算图像的二阶方向微分。

具体来说,“2nd_ddg”表示:

2nd - 二阶导数,相当于拉普拉斯算子
ddg - directional derivative in Gaussian scale space,高斯尺度空间下的方向微分
所以 component="2nd_ddg" 将计算每个像素在高斯尺度空间下,两个方向(水平和竖直)的二阶微分之和。

这相当于计算图像的拉普拉斯运算符,可以用来实现像素级的edge/blob检测。
这将计算img的二阶方向微分,得到拉普拉斯图像laplacian。

相比一阶微分,二阶微分对噪声更加敏感,所以需要合适的高斯平滑(sigma参数)。

总之,设置 component="2nd_ddg" 可以直接使用 derviate_gauss 来计算图像的拉普拉斯结果。


在 halocn 的derivate_gauss函数中,当component参数设置为"gradient"时,表示计算图像的梯度幅值。

具体来说,它将同时计算图像x方向和y方向的一阶导数,然后计算这两个方向导数的幅值作为最终输出。

计算过程如下:

分别计算图像竖直方向(x)和水平方向(y)的一阶导数,即dx和dy

计算每个像素的梯度幅值:grad = sqrt(dx^2 + dy^2)

grad就是输出的梯度幅值图像
这将计算img的梯度幅值图像grad。

相比只计算某个方向的一阶导数,梯度幅值能反映像素的整体变化程度。它常用于边缘检测等任务。

所以,设置component="gradient"可以直接使用derivate_gauss获得图像梯度结果。

需要注意的是,要得到灰度梯度图像,img需要是单通道图像。如果是三通道彩色图,结果grad也会是三通道。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 孤岛125 发表于 2023-8-15 15:32:59 | 显示全部楼层
感谢帮我耐心解答,然后我还有疑问就是:
“分别计算图像竖直方向(x)和水平方向(y)的一阶导数,即dx和dy

计算每个像素的梯度幅值:grad = sqrt(dx^2 + dy^2)”
这里,halcon官方手册里写的是sqrt(dx^2 * dy^2),是乘积,写的不是平方和,所以我一直就在这个地方存在很大的困扰,叨扰您
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zjjdsg 发表于 2023-8-15 16:07:30 | 显示全部楼层
孤岛125 发表于 2023-8-15 15:32
感谢帮我耐心解答,然后我还有疑问就是:
“分别计算图像竖直方向(x)和水平方向(y)的一阶导数,即dx和dy

在一些图像处理算法中,有时会使用 dx^2 * dy^2 而不是 dx^2 + dy^2 来计算梯度幅值。

这主要有以下原因:

计算效率更高
dx^2 * dy^2 的计算效率比 dx^2 + dy^2 要高,前者只需要一次乘法,后者需要一次加法和两次平方。在需要处理大量像素时,这可以带来明显的性能提升。

强调同时存在的边缘
dx^2 + dy^2 会响应任意方向的边缘。但在某些情况下,我们只关心同时存在显著的水平和垂直边缘的点,如角点、交叉点等。dx^2 * dy^2 能够抑制仅存在单方向边缘的响应。

数值更稳定
当梯度较小时,dx^2 + dy^2 容易产生数值误差。而dx^2 * dy^2 不会有这个问题。

所以,在halocn的derivate_gauss实现中,使用dx^2 * dy^2 主要是为了计算效率和数值稳定性,它假设目标边缘主要是交叉方向的,不太关心仅存在单方向边缘的点。这在检测角点等场景下是合理的。

但若要检测整幅图像的所有边缘,dx^2 + dy^2 仍是更标准更广泛的方式。算法设计要根据具体目标选择合适的梯度幅值计算方法。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
小红居 发表于 2023-8-15 16:21:56 | 显示全部楼层
zjjdsg 发表于 2023-8-15 12:50
derivate_gauss是halocn库中实现高斯微分的函数。它可以对图像进行高斯微分操作。

在 halocn 的derivate_g ...

牛皮,点赞
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zjjdsg 发表于 2023-8-15 19:25:13 | 显示全部楼层

都百度的,我一个技校生哪懂这些
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 孤岛125 发表于 2023-8-16 14:40:55 | 显示全部楼层
zjjdsg 发表于 2023-8-15 19:25
都百度的,我一个技校生哪懂这些

哈哈,大神谦虚了,毕竟我百度都没搜到你讲的这些
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zjjdsg 发表于 2023-8-16 14:48:23 | 显示全部楼层
孤岛125 发表于 2023-8-16 14:40
哈哈,大神谦虚了,毕竟我百度都没搜到你讲的这些

https://poe.com/ChatGPT 都是ai的功劳要加速器的话加我微信我发你
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表