2015-11-12 4 views
0

Я написал код VB для вычисления коэффициента корреляции между оригинальным и зашифрованным изображением. Значения коэффициента корреляции находятся в диапазоне от 0 до 1, однако после реализации кода ниже значения больше, чем один, например, 2 или 4. Уравнение, с которым я работал, выглядит следующим образом: Можете ли вы проверить, почему я получаю эти значения, Пожалуйста.уравнение коэффициента корреляции не работает

enter image description here

Это код, который я использовал, пожалуйста, обратите внимание, все переменный устанавливаются в ноль до й и у петли:

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 
+0

Все данные указаны верно. Возможно, Red, nred - 0-255, но ожидаемая формула 0-1 –

+0

Какое значение вы используете для коэффициента корреляции для двух красных изображений? (R = 255, G = 0, B = 0) – Jaco

+0

Не могли бы вы обрезать код до красноты (при условии, что он дает плохие значения)? И я бы предложил лучшие имена, чем 'sum [rgb] [123]': 'sum [rgb] 1' может быть' covar [rgb] ',' sum [rgb] 2' может быть 'var [rgb]' и 'sum [rgb] 3' может быть' nvar [rgb] '. – Teepeemm

ответ

0

Я ограничил свой фрагмент кода на красный и создал два функции, которые возвращают только одно значение пикселя для x=0 и y=0. Этот фрагмент кода, похоже, работает и возвращает коэффициенты корреляции между -1 и 1. Обратите внимание, что я объявил meanr_o, meanr_e, sumr1, sumr2, sumr3, Corr_r как удваивает. Я также использую Math.Sqrt вместо Sqr, вы можете найти .NET-скрипт here.

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 
+0

Спасибо за ваш ответ, однако код возвращает неверные значения коэффициента корреляции, такие как -6 или -4. Я проверил все значения red() и nred(), но не работает. – user3819984

+0

Пример: возвращает коэффициент корреляции 1, а выход - «Корреляция: 1» с использованием .NET Framework 4.5. Что возвращает пример для вас? – Jaco

+0

Пример возвращает 1, однако при использовании его для изображений результаты неверны. – user3819984

Смежные вопросы