Падение производительности метода обработки изображения - C#

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

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

Есть 2 метода, осуществляющие фильтрацию, они почти идентичны, однако один отрабатывает 7 секунд, второй 3 минуты. Не могу найти причину таких тормозов 2го метода. 1й, быстрый:
Листинг программы
  1. double c = 0, m = 1, c1 = 0, c2 = 0, c3 = 0;
  2. int count = 0;
  3. int inc = Convert.ToInt16(comboBox1.SelectedItem);
  4. Bitmap bmp = new Bitmap(pictureBox1.Image);
  5. Color color;
  6. for (int y = 0; y < img_h; y++) {
  7. for (int x = 0; x < img_w; x++) {
  8. for (int j = -(inc - 1) / 2; j <= (inc - 1) / 2; j++) {
  9. for (int i = -(inc - 1) / 2; i <= (inc - 1) / 2; i++) {
  10. if (x + i >= 0 && x + i < img_w && y + j >= 0 && y + j < img_h) {
  11. color = bmp.GetPixel(x + i, y + j);
  12. c1 = Convert.ToDouble(color.R);
  13. c2 = Convert.ToDouble(color.G);
  14. c3 = Convert.ToDouble(color.B);
  15. HSV(color, out c1, out c2, out c3);
  16. if (c3 * 100 > 10) {
  17. m = m * c3 * 100;
  18. count++; }
  19. }
  20. }
  21. }
  22. c3 = Math.Pow(m, 1d / count) / 100;
  23. RGB(c1, c2, c3);
  24. bmp.SetPixel(x, y, Color.FromArgb(x1, x2, x3));
  25. c = 0;
  26. m = 1;
  27. count = 0;
  28. }
  29. progressBar1.Value = y;
  30. progressBar1.Refresh();
  31. Invalidate();
  32. Application.DoEvents();
  33. }
  34. pictureBox1.Image = bmp;
  35. progressBar1.Value = 0;
2й, медленный:
Листинг программы
  1. double c1 = 0, c2 = 0, c3 = 0;
  2. var list = new List<double>();
  3. int cx = (int)comboBox1.SelectedItem;
  4. int cy = (int)comboBox2.SelectedItem;
  5. int l = cx - 1;
  6. int r = mx - cx;
  7. int u = cy - 1;
  8. int d = my - cy;
  9. Bitmap bmp = new Bitmap(pictureBox1.Image);
  10. Color color;
  11. for (int y = 0; y < h; y++) {
  12. for (int x = 0; x < w; x++) {
  13. for (int j = -u; j <= d; j++) {
  14. for (int i = -l; i <= r; i++) {
  15. if (x + i >= 0 && x + i < w && y + j >= 0 && y + j < h) {
  16. color = bmp.GetPixel(x + i, y + j);
  17. c1 = Convert.ToDouble(color.R);
  18. c2 = Convert.ToDouble(color.G);
  19. c3 = Convert.ToDouble(color.B);
  20. RGBtoHSV(color, out c1, out c2, out c3);
  21. for (int t = 1; t <= Convert.ToInt16(textBox1.Lines[cy - 1 + j][cx - 1 + i].ToString()); t++) {
  22. list.Add(c3); }
  23. }
  24. }
  25. }
  26. list.Sort();
  27. if (list.Count() % 2 == 0)
  28. {
  29. c3 = (list[(list.Count() / 2) - 1] + list[(list.Count() / 2)]) / 2;
  30. }
  31. else
  32. {
  33. c3 = list[(list.Count() - 1) / 2];
  34. }
  35. HSVtoRGB(c1, c2, c3);
  36. bmp.SetPixel(x, y, Color.FromArgb(x1, x2, x3));
  37. list.Clear();
  38. }
  39. button2.Text = Math.Round((double)y / (double)h * 100, 0).ToString() + " %";
  40. Invalidate();
  41. Application.DoEvents();
  42. }
  43. pictureBox1.Image = bmp;
  44. button2.Text = "Фильтр";
Оба цикла проходят по всем пикселям картинки 1024х768, накладывая маску 3х3 на них, преобразуя каждый(1024х768х9) пиксель из цветового пространства RGB в HSV, находя среднее значение яркости, и преобразовывая найденную яркость обратно в RGB. Огромных отличий в методах на первый взгляд не видно, однако разница в производительности существенна. Что может тормозить процесс?

Решение задачи: «Падение производительности метода обработки изображения»

textual
Листинг программы
  1. for (int t = 1; t <= Convert.ToInt16(textBox1.Lines[cy - 1 + j][cx - 1 + i].ToString()); t++)

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


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

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

14   голосов , оценка 4.071 из 5

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

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

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