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

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

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

Добрый день. Имеется реалицация метода Оцу на C++, необходимо перенести код в C#. Помогите пожалуйста в реализации, или может имеется готовое решение.
Листинг программы
  1. typedef unsigned char imageInt;
  2. // Определение порога методом Оцу
  3. int otsuThreshold(imageInt *image, int size)
  4. {
  5. // Проверки на NULL и проч. опустим, чтобы сконцетрироваться
  6. // на работе метода
  7. // Посчитаем минимальную и максимальную яркость всех пикселей
  8. int min = image[0];
  9. int max = image[0];
  10. for (int i = 1; i < size; i++)
  11. {
  12. int value = image[i];
  13. if (value < min)
  14. min = value;
  15. if (value > max)
  16. max = value;
  17. }
  18. // Гистограмма будет ограничена снизу и сверху значениями min и max,
  19. // поэтому нет смысла создавать гистограмму размером 256 бинов
  20. int histSize = max - min + 1;
  21. int* hist = new int[histSize];
  22. // Заполним гистограмму нулями
  23. for (int t = 0; t < histSize; t++)
  24. hist[t] = 0;
  25. // И вычислим высоту бинов
  26. for (int i = 0; i < size; i++)
  27. hist[image[i] - min]++;
  28. // Введем два вспомогательных числа:
  29. int m = 0; // m - сумма высот всех бинов, домноженных на положение их середины
  30. int n = 0; // n - сумма высот всех бинов
  31. for (int t = 0; t <= max - min; t++)
  32. {
  33. m += t * hist[t];
  34. n += hist[t];
  35. }
  36. float maxSigma = -1; // Максимальное значение межклассовой дисперсии
  37. int threshold = 0; // Порог, соответствующий maxSigma
  38. int alpha1 = 0; // Сумма высот всех бинов для класса 1
  39. int beta1 = 0; // Сумма высот всех бинов для класса 1, домноженных на положение их середины
  40. // Переменная alpha2 не нужна, т.к. она равна m - alpha1
  41. // Переменная beta2 не нужна, т.к. она равна n - alpha1
  42. // t пробегается по всем возможным значениям порога
  43. for (int t = 0; t < max - min; t++)
  44. {
  45. alpha1 += t * hist[t];
  46. beta1 += hist[t];
  47. // Считаем вероятность класса 1.
  48. float w1 = (float)beta1 / n;
  49. // Нетрудно догадаться, что w2 тоже не нужна, т.к. она равна 1 - w1
  50. // a = a1 - a2, где a1, a2 - средние арифметические для классов 1 и 2
  51. float a = (float)alpha1 / beta1 - (float)(m - alpha1) / (n - beta1);
  52. // Наконец, считаем sigma
  53. float sigma = w1 * (1 - w1) * a * a;
  54. // Если sigma больше текущей максимальной, то обновляем maxSigma и порог
  55. if (sigma > maxSigma)
  56. {
  57. maxSigma = sigma;
  58. threshold = t;
  59. }
  60. }

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

textual
Листинг программы
  1.         private static unsafe int OtsuMethod(ref BitmapData bmData)
  2.         {
  3.  
  4.             var hist = new int[256];
  5.             Array.Clear(hist, 0, hist.Length);
  6.  
  7.             int height = bmData.Height;
  8.             int width = bmData.Width;
  9.             int stride = bmData.Stride;
  10.             var row = (byte*) (bmData.Scan0);
  11.             int i;
  12.  
  13.             for (int j = 0; j < height; j++)
  14.             {
  15.                 for (i = 0; i < width; i++)
  16.                 {
  17.                     hist[row[i]]++;
  18.                 }
  19.                 row += stride;
  20.             }
  21.  
  22.             float sum = 0; // Total
  23.             for (i = 1; i < 256; i++)
  24.             {
  25.                 sum += i*hist[i];
  26.             }
  27.  
  28.             float sumB = 0; // Current
  29.             int wB = 0; // Weight Background
  30.             int wF; // Weight Foreground
  31.  
  32.             int threshold = 0;
  33.             int total = width*height;
  34.             float mD; // Mean difference
  35.             float currentMax, totalMax = 0;
  36.  
  37.  
  38.             for (i = 0; i < 256; i++)
  39.             {
  40.                 // Weight Background
  41.                 wB += hist[i];
  42.                 if (wB == 0) continue;
  43.  
  44.                 // Weight Foreground
  45.                 wF = total - wB;
  46.                 if (wF == 0) break;
  47.  
  48.                 sumB += i*hist[i];
  49.  
  50.                 // Means
  51.                 mD = sumB/wB - (sum - sumB)/wF;
  52.  
  53.                 // Variance between classes
  54.                 // [url]http://upload.wikimedia.org/math/8/9/4/894892ba54d00a159aaebfb515c6643d.png[/url]
  55.                 currentMax = wB*wF*mD*mD;
  56.  
  57.                 // If new maximum found
  58.                 if (currentMax > totalMax)
  59.                 {
  60.                     totalMax = currentMax;
  61.                     threshold = i; // New threshold
  62.                 }
  63.             }
  64.  
  65.             return threshold;
  66.         }

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


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

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

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы