Перевести код из C++ - реализация метода Оцу - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. Имеется реалицация метода Оцу на C++, необходимо перенести код в C#. Помогите пожалуйста в реализации, или может имеется готовое решение.
   typedef unsigned char imageInt;
    
   // Определение порога методом Оцу
   int otsuThreshold(imageInt *image, int size)
   {
     // Проверки на NULL и проч. опустим, чтобы сконцетрироваться
     // на работе метода
    
     // Посчитаем минимальную и максимальную яркость всех пикселей
    int min = image[0];
    int max = image[0];
   
    for (int i = 1; i < size; i++)
    {
      int value = image[i];
   
      if (value < min)
        min = value;
   
      if (value > max)
        max = value;
    }
   
    // Гистограмма будет ограничена снизу и сверху значениями min и max,
    // поэтому нет смысла создавать гистограмму размером 256 бинов
    int histSize = max - min + 1;
    int* hist = new int[histSize];
   
    // Заполним гистограмму нулями
    for (int t = 0; t < histSize; t++)
      hist[t] = 0;
   
    // И вычислим высоту бинов
    for (int i = 0; i < size; i++)
      hist[image[i] - min]++;
   
    // Введем два вспомогательных числа:
    int m = 0; // m - сумма высот всех бинов, домноженных на положение их середины
    int n = 0; // n - сумма высот всех бинов
    for (int t = 0; t <= max - min; t++)
    {
      m += t * hist[t];
      n += hist[t];
    }
   
    float maxSigma = -1; // Максимальное значение межклассовой дисперсии
    int threshold = 0; // Порог, соответствующий maxSigma
   
    int alpha1 = 0; // Сумма высот всех бинов для класса 1
    int beta1 = 0; // Сумма высот всех бинов для класса 1, домноженных на положение их середины
   
    // Переменная alpha2 не нужна, т.к. она равна m - alpha1
    // Переменная beta2 не нужна, т.к. она равна n - alpha1
   
    // t пробегается по всем возможным значениям порога
    for (int t = 0; t < max - min; t++)
    {
      alpha1 += t * hist[t];
      beta1 += hist[t];
   
      // Считаем вероятность класса 1.
      float w1 = (float)beta1 / n;
      // Нетрудно догадаться, что w2 тоже не нужна, т.к. она равна 1 - w1
   
      // a = a1 - a2, где a1, a2 - средние арифметические для классов 1 и 2
      float a = (float)alpha1 / beta1 - (float)(m - alpha1) / (n - beta1);
      
      // Наконец, считаем sigma
      float sigma = w1 * (1 - w1) * a * a;
   
      // Если sigma больше текущей максимальной, то обновляем maxSigma и порог
      if (sigma > maxSigma)
      {
        maxSigma = sigma;
        threshold = t;
      }
    }

Решение задачи: «Перевести код из C++ - реализация метода Оцу»

textual
Листинг программы
        private static unsafe int OtsuMethod(ref BitmapData bmData)
        {
 
            var hist = new int[256];
            Array.Clear(hist, 0, hist.Length);
 
            int height = bmData.Height;
            int width = bmData.Width;
            int stride = bmData.Stride;
            var row = (byte*) (bmData.Scan0);
            int i;
 
            for (int j = 0; j < height; j++)
            {
                for (i = 0; i < width; i++)
                {
                    hist[row[i]]++;
                }
                row += stride;
            }
 
            float sum = 0; // Total
            for (i = 1; i < 256; i++)
            {
                sum += i*hist[i];
            }
 
            float sumB = 0; // Current
            int wB = 0; // Weight Background
            int wF; // Weight Foreground
 
            int threshold = 0;
            int total = width*height;
            float mD; // Mean difference 
            float currentMax, totalMax = 0;
 
 
            for (i = 0; i < 256; i++)
            {
                // Weight Background
                wB += hist[i];
                if (wB == 0) continue;
 
                // Weight Foreground
                wF = total - wB;
                if (wF == 0) break;
 
                sumB += i*hist[i];
 
                // Means
                mD = sumB/wB - (sum - sumB)/wF;
 
                // Variance between classes 
                // [url]http://upload.wikimedia.org/math/8/9/4/894892ba54d00a159aaebfb515c6643d.png[/url]
                currentMax = wB*wF*mD*mD;
 
                // If new maximum found
                if (currentMax > totalMax)
                {
                    totalMax = currentMax;
                    threshold = i; // New threshold
                }
            }
 
            return threshold;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы