2

私の数学は少しさびています。0 ~ 255 の範囲のグレースケール値を表す 2D 配列のヒストグラムを均等化しようとしています (値の計算方法により、値が整数にならない場合があります)。

ウィキペディアでこの記事を見つけましたが、それらが提示する式がよくわかりません。

ni、計算はできますがn、この関数Lを実装する方法がよくわかりません。この機能cdfは役に立ちますか?

ここに私がこれまでに持っているものがあります:

static double[,] Normalize(double[,] mat)
{
    int width = mat.GetLength(0);
    int height = mat.GetLength(1);
    int nPixels = width*height;

    double sum = 0;
    double max = double.MinValue;
    double min = double.MaxValue;
    var grayLevels = new Dictionary<double, int>();

    foreach (var g in mat)
    {
        sum += g;
        if (g > max) max = g;
        if (g < min) min = g;
        if (!grayLevels.ContainsKey(g)) grayLevels[g] = 0;
        ++grayLevels[g];
    }
    double avg = sum/nPixels;
    double range = max - min;

    var I = new double[width,height];

    // how to normalize?

    return I;
}
4

6 に答える 6

3

役に立ちそうなものを見つけた

http://sonabstudios.blogspot.in/2011/01/histogram-equalization-algorithm.html

それが役立つことを願っています

于 2013-05-22T04:14:00.980 に答える
2

累積分布関数の計算には、いくつかの手順が含まれます。

まず、グレースケール値の度数分布を取得します。

次のようなものです:

freqDist = new int[256];

for each (var g in mat)
{
    int grayscaleInt = (int)g;
    freqDist[grayscaleInt]++;
}

次に、CDF を取得するには、次のようにします。

cdf = new int[256];
int total = 0;

for (int i = 0; i < 256; i++)
{
    total += freqDist[i];
    cdf[i] = total;
}
于 2013-05-22T04:25:38.257 に答える
2

私はあなたがあなたのリンクを理解するのを助けることができます.

まず、画像を表すカウント値がそのリンクに表示され、

Value   Count   Value   Count   Value   Count   Value   Count   Value   Count
   52       1      64       2      72       1      85       2     113       1
   55       3      65       3      73       2      87       1     122       1
   58       2      66       2      75       1      88       1     126       1
   59       3      67       1      76       1      90       1     144       1
   60       1      68       5      77       1      94       1     154       1
   61       4      69       3      78       1     104       2   
   62       1      70       4      79       2     106       1
   63       2      71       2      83       1     109       1

つまり、画像は上記の値で作成され、他には何もありません。

次に、値を 52 から 154 まで累積的に合計します

Value   cdf Value   cdf Value   cdf Value   cdf Value   cdf
   52     1    64    19    72    40    85    51   113    60
   55     4    65    22    73    42    87    52   122    61
   58     6    66    24    75    43    88    53   126    62
   59     9    67    25    76    44    90    54   144    63
   60    10    68    30    77    45    94    55   154    64
   61    14    69    33    78    46   104    57 
   62    15    70    37    79    48   106    58
   63    17    71    39    83    49   109    59

それは手段であり、

value 52 have 1 cdf cause it is initial value, 
value 55 have 4 cdf cause it has 3 count in image plus 1 cdf from 52, 
value 58 have 6 cdf cause it has 2 count in image plus 4 cdf from 55,
and so on.. till..
value 154 have 64 cdf cause it has 1 count in image plus 63 cdf from 144.

次に、関数に基づいて各画像値のヒストグラム均等化式を計算します

cdf(v) は、現在のイメージ値からの現在の cdf 値を表します。

この場合、もしh(v) = 61そうならcdf(v) = 14

cdfmin は、初期の cdf 値を表します。この場合、値 52 からの 1 つの cdf です。

幸せなコーディング.. ^^

于 2013-05-22T04:49:38.563 に答える