Vb.net 相关系数方程不起作用

Vb.net 相关系数方程不起作用,vb.net,algorithm,math,vb6,Vb.net,Algorithm,Math,Vb6,我写了一个VB代码来计算原始图像和加密图像之间的相关系数。然而,在实现下面的代码之后,相关系数值的范围在0到1之间,这些数值大于诸如2或4之类的数值。我使用的方程式如下: 请你检查一下我为什么要买这些淡水河谷好吗 这是我使用的代码,请注意,在x和y循环之前,所有变量都设置为零: For y = 0 To hgt-1: For x = 0 To wid-1 meanr_o = meanr_o + Red(x, y) meang_o = meang_o + Grn(x, y) meanb_o = m

我写了一个VB代码来计算原始图像和加密图像之间的相关系数。然而,在实现下面的代码之后,相关系数值的范围在0到1之间,这些数值大于诸如2或4之类的数值。我使用的方程式如下: 请你检查一下我为什么要买这些淡水河谷好吗

这是我使用的代码,请注意,在x和y循环之前,所有变量都设置为零:

For y = 0 To hgt-1: For x = 0 To wid-1
meanr_o = meanr_o + Red(x, y)
meang_o = meang_o + Grn(x, y)
meanb_o = meanb_o + Blu(x, y)

meanr_e = meanr_e + nred(x, y)
meang_e = meang_e + nGrn(x, y)
meanb_e = meanb_e + nBlu(x, y)

N = N + 1
Next x: Next y

meanr_o = meanr_o / N
meang_o = meang_o / N
meanb_o = meanb_o / N
meanr_e = meanr_e / N
meang_e = meang_e / N
meanb_e = meanb_e / N

 For y = 0 To hgt-1: For x = 0 To wid-1

sumr1 = sumr1 + ((Red(x, y) - meanr_o) * (nred(x, y) - meanr_e))
sumr2 = sumr2 + ((Red(x, y) - meanr_o) ^ 2)
sumr3 = sumr3 + ((nred(x, y) - meanr_e) ^ 2)
''''''''''''''''''''''''''''''''''''''''''
sumg1 = sumg1 + ((Grn(x, y) - meang_o) * (nGrn(x, y) - meang_e))
sumg2 = sumg2 + ((Grn(x, y) - meang_o) ^ 2)
sumg3 = sumg3 + ((nGrn(x, y) - meang_e) ^ 2)
''''''''''''''''''''''''''''''''''''''''''
sumb1 = sumb1 + ((Blu(x, y) - meanb_o) * (nBlu(x, y) - meanb_e))
sumb2 = sumb2 + ((Blu(x, y) - meanb_o) ^ 2)
sumb3 = sumb3 + ((nBlu(x, y) - meanb_e) ^ 2)

Next x: Next y
sumr1 = sumr1 / N
sumr2 = sumr2 / N
sumr3 = sumr3 / N

sumg1 = sumg1 / N
sumg2 = sumg2 / N
sumg3 = sumg3 / N

sumb1 = sumb1 / N
sumb2 = sumb2 / N
sumb3 = sumb3 / N

Corr_r = sumr1 / Sqr(sumr2 * sumr3)
Corr_g = sumg1 / Sqr(sumg2 * sumg3)
Corr_b = sumb1 / Sqr(sumb2 * sumb3)
Corr = (Corr_r + Corr_g + Corr_b) / 3
Label1.Caption = Corr

我将您的代码片段限制为红色,并创建了两个函数,它们只返回x=0和y=0的一个像素值。此代码段似乎正在工作,并返回-1和1之间的相关系数。请注意,我已宣布meanr_o、meanr_e、sumr1、sumr2、sumr3、Corr_r为双打。我也在用Math.Sqrt代替Sqr,你可以找到一个.NET提琴


你的输入正确吗?也许红色、nred为0-255,但公式预计为0-1两幅红色图像的相关系数的值是多少?R=255,G=0,B=0如果代码给出的值不正确,是否可以将代码裁剪为红色?我建议使用比sum[rgb][123更好的名称:sum[rgb]1可以是covar[rgb],sum[rgb]2可以是var[rgb],sum[rgb]3可以是nvar[rgb]。@user3819984我理解这一点。我的意思是,我没有发现您的代码有任何错误,并且怀疑错误可能在其他地方。你需要把它转换成一种颜色,其中一个步骤就是只关注红色。包括Sqr。包括Red和nred的数据,可能只需按字面意思输入即可。您使用的图像分辨率是多少?如果它太大,那么可能是您的数据类型溢出了。。。首先尝试较小的变量,如果没有错误,则尝试切换到较大的变量,或者确保您在范围内处于浮动状态……感谢您的回答,但是,代码返回的相关系数值不正确,例如-6或-4。我检查了所有red和nred值,但它不起作用。示例as返回的相关系数为1,使用.NET Framework 4.5输出的相关系数为:1。示例返回了什么?示例返回1,但是当将其用于图像时,结果不正确。您可以发布这些图像中的任何一个吗?我想知道从图像返回像素值的代码中是否有错误。
Public Module Module1
    Function Red(ByVal x As Integer, ByVal y As Integer) As Integer
        ' local variable declaration */
        Dim result As Integer
        If (x = 0) And (y = 0) Then
            result = 255
        Else
            result = 0
        End If
        Red = result
    End Function

    Function nred(ByVal x As Integer, ByVal y As Integer) As Integer
        ' local variable declaration */
        Dim result As Integer
        If (x = 0) And (y = 0) Then
            result = 255
        Else
            result = 0
        End If
        nred = result
    End Function

    Public Sub Main()
        Dim hgt, wid, N As Integer
        Dim meanr_o, meanr_e, sumr1, sumr2, sumr3, Corr_r As Double
        hgt = 255
        wid = 255
        For y = 0 To hgt - 1 : For x = 0 To wid - 1
                meanr_o = meanr_o + Red(x, y)
                meanr_e = meanr_e + nred(x, y)
                N = N + 1
            Next x : Next y

        meanr_o = meanr_o / N
        meanr_e = meanr_e / N

        For y = 0 To hgt - 1 : For x = 0 To wid - 1
                sumr1 = sumr1 + ((Red(x, y) - meanr_o) * (nred(x, y) - meanr_e))
                sumr2 = sumr2 + ((Red(x, y) - meanr_o) ^ 2)
                sumr3 = sumr3 + ((nred(x, y) - meanr_e) ^ 2)
            Next x : Next y
        sumr1 = sumr1 / N
        sumr2 = sumr2 / N
        sumr3 = sumr3 / N

        Corr_r = sumr1 / System.Math.Sqrt(sumr2 * sumr3)
        System.Console.WriteLine("Correlation is : {0}", Corr_r)

    End Sub
End Module