使用opencv拟合高斯图像

信息处理 图像处理 opencv 高斯
2022-02-24 16:17:23

我正在阅读 opencv 文档和 SO 中的一些问题,但它似乎没有提供这些信息。

我有头像I(x,y)我想找到一个高斯函数fμ,Σ(x,y)这样

fμ,Σ(x,y)I(x,y)
使用 LSE 或 MLE 估计。μ是平均向量和Σ是协方差矩阵。我的问题是是否有执行此类任务的任何 opencv 函数。

人们建议从头开始实现估计器,尽管有些人建议为此目的使用 LM 算法,而且总的来说似乎不是很困难我想知道是否有任何功能用于这种目的。

有没有?

谢谢

2个回答

好像没有你说的那么明显。我无法通过时刻来检索 sigma 的值。这是一个可复制的代码:

import cv2
import numpy as np

for i in range(1,100,5):
    x, y = np.meshgrid(np.linspace(-1,1,250), np.linspace(-1,1,250))
    d = np.sqrt(x*x+y*y)
    sigma, mu = i/100, 0.0
    im = np.exp(-( (d-mu)**2 / ( 2.0 * sigma**2 ) ) )
    ms = cv2.moments(im)

    w = np.sqrt(ms['mu20']/ms['m00'])
    h = np.sqrt(ms['mu02']/ms['m00'])

    x = ms['m10']/ms['m00']
    y = ms['m01']/ms['m00']

    #w,h should be proportionnal to sigma
    print(x,w,y,h)

输出:

124.50000000000003 1.2450000000043133 124.5 1.2450000000067136
124.50000000000004 7.46999999999997 124.50000000000004 7.469999999999793
124.5 13.695000000000055 124.50000000000003 13.694999999999826
124.49999999999996 19.919999860176716 124.49999999999991 19.91999986017709
124.49999999999994 26.14445837769508 124.49999999999991 26.144458377695315
124.50000000000004 32.341175190026235 124.50000000000003 32.341175190026235
124.49999999999996 38.330785155074466 124.49999999999999 38.330785155074466
124.50000000000007 43.78215361374663 124.50000000000001 43.78215361374682
124.50000000000001 48.456482631148084 124.49999999999999 48.4564826311482
124.50000000000001 52.311348835800736 124.49999999999997 52.311348835800885
124.49999999999997 55.43113033682788 124.49999999999996 55.43113033682795
124.50000000000006 57.94254510306185 124.50000000000007 57.942545103061796
124.50000000000004 59.96906667795289 124.50000000000007 59.96906667795291
124.50000000000003 61.614844668595225 124.50000000000001 61.61484466859529
124.49999999999996 62.96253286135033 124.50000000000004 62.96253286135014
124.5 64.07604806231855 124.50000000000003 64.07604806231855
124.5 65.00437844448308 124.50000000000003 65.00437844448301
124.49999999999996 65.78506419998082 124.49999999999999 65.78506419998084
124.5 66.44700119861258 124.50000000000001 66.44700119861257
124.49999999999999 67.01258437680303 124.50000000000003 67.01258437680295

我尝试了其他方法,但似乎没有任何效果。

我想要像素数的 sigma 或高斯定义中的实际 sigma,但我都无法检索。你能告诉我更多关于如何进行的信息吗?

(ps对不起,我没有声誉点直接评论你的答案,这很奇怪)

一种简单的方法是计算图像矩。OpenCV 函数moments执行此操作。

m00说明了强度缩放,m01给出m10了高斯的原点,mu20mu02给出了沿轴的方差。如果高斯可以旋转,则需要包含mu11在混合中。这三个最后的值然后形成高斯的协方差矩阵。

那是,

μ=[m10,m01]TΣ=[m20,m11m11,m02]