-
Notifications
You must be signed in to change notification settings - Fork 1
/
MmseEdgeDetectionMatrixfilter.cs
126 lines (104 loc) · 4.48 KB
/
MmseEdgeDetectionMatrixfilter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* MetaphysicsIndustries.Acuity
* Copyright (C) 2009-2021 Metaphysics Industries, Inc., Richard Sartor
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
*/
using System;
using System.Collections.Generic;
using System.Text;
namespace MetaphysicsIndustries.Acuity
{
[Serializable]
public class MmseEdgeDetectionMatrixfilter : MinimalMeanSquareErrorMatrixFilter
{
public MmseEdgeDetectionMatrixfilter(int windowSize, float noiseVariance)
: this(windowSize, noiseVariance, 1)
{
}
public MmseEdgeDetectionMatrixfilter(int windowSize, float noiseVariance, float gamma)
: base(windowSize, noiseVariance)
{
_gamma = gamma;
}
private float _gamma;
public float Gamma
{
get { return _gamma; }
}
//private float _noiseVariance;
//protected class SignalMeanInfo
//{
// public float sum = 0;
// public int count = 0;
//}
//protected class SignalVarianceInfo
//{
// public float sum = 0;
// public int count = 0;
// public float signalMean = 0;
//}
//protected override float PerPixelOperation(Matrix input, int row, int column)
//{
// float signalMean;
// float signalVariance;
// float noiseVariance;
// signalMean = CalculateSignalMean(input, row, column);
// signalVariance = CalculateSignalVariance(input, row, column, signalMean);
// noiseVariance = CalculateNoiseVariance();
// float ratio = noiseVariance / signalVariance;
// return CalculateFinalValue(input, row, column, signalMean, ratio);
//}
protected override float CalculateFinalValue(Matrix input, int row, int column, float signalMean, float ratio)
{
return (float)(1 - Math.Pow(ratio, Gamma));// *input[row, column] + ratio * signalMean;
}
//protected virtual float CalculateNoiseVariance()
//{
// return _noiseVariance;
//}
//protected virtual float CalculateSignalVariance(Matrix input, int row, int column, float signalMean)
//{
// float signalVariance;
// SignalVarianceInfo signalVarianceInfo = new SignalVarianceInfo();
// signalVarianceInfo.signalMean = signalMean;
// DoWindowPass(input, row, column, InternalCalcSignalVariance, signalVarianceInfo);
// signalVariance = signalVarianceInfo.sum / (signalVarianceInfo.count - 1);
// return signalVariance;
//}
//protected virtual float CalculateSignalMean(Matrix input, int row, int column)
//{
// float signalMean;
// SignalMeanInfo signalMeanInfo = new SignalMeanInfo();
// DoWindowPass(input, row, column, InternalCalcSignalMean, signalMeanInfo);
// //signalMean = sum / count;
// signalMean = signalMeanInfo.sum / signalMeanInfo.count;
// return signalMean;
//}
//protected virtual void InternalCalcSignalMean(float value, int row, int column, int rowWithinWindow, int columnWithinWindow, SignalMeanInfo signalMeanInfo)
//{
// signalMeanInfo.sum += value;
// signalMeanInfo.count++;
//}
//protected virtual void InternalCalcSignalVariance(float value, int row, int column, int rowWithinWindow, int columnWithinWindow, SignalVarianceInfo signalVarianceInfo)
//{
// value -= signalVarianceInfo.signalMean;
// signalVarianceInfo.sum += value * value;
// signalVarianceInfo.count++;
//}
}
}