Падение производительности метода обработки изображения - C#
Формулировка задачи:
Есть 2 метода, осуществляющие фильтрацию, они почти идентичны, однако один отрабатывает 7 секунд, второй 3 минуты.
Не могу найти причину таких тормозов 2го метода.
1й, быстрый:
2й, медленный:
Оба цикла проходят по всем пикселям картинки 1024х768, накладывая маску 3х3 на них, преобразуя каждый(1024х768х9) пиксель из цветового пространства RGB в HSV, находя среднее значение яркости, и преобразовывая найденную яркость обратно в RGB.
Огромных отличий в методах на первый взгляд не видно, однако разница в производительности существенна.
Что может тормозить процесс?
double c = 0, m = 1, c1 = 0, c2 = 0, c3 = 0;
int count = 0;
int inc = Convert.ToInt16(comboBox1.SelectedItem);
Bitmap bmp = new Bitmap(pictureBox1.Image);
Color color;
for (int y = 0; y < img_h; y++) {
for (int x = 0; x < img_w; x++) {
for (int j = -(inc - 1) / 2; j <= (inc - 1) / 2; j++) {
for (int i = -(inc - 1) / 2; i <= (inc - 1) / 2; i++) {
if (x + i >= 0 && x + i < img_w && y + j >= 0 && y + j < img_h) {
color = bmp.GetPixel(x + i, y + j);
c1 = Convert.ToDouble(color.R);
c2 = Convert.ToDouble(color.G);
c3 = Convert.ToDouble(color.B);
HSV(color, out c1, out c2, out c3);
if (c3 * 100 > 10) {
m = m * c3 * 100;
count++; }
}
}
}
c3 = Math.Pow(m, 1d / count) / 100;
RGB(c1, c2, c3);
bmp.SetPixel(x, y, Color.FromArgb(x1, x2, x3));
c = 0;
m = 1;
count = 0;
}
progressBar1.Value = y;
progressBar1.Refresh();
Invalidate();
Application.DoEvents();
}
pictureBox1.Image = bmp;
progressBar1.Value = 0; double c1 = 0, c2 = 0, c3 = 0;
var list = new List<double>();
int cx = (int)comboBox1.SelectedItem;
int cy = (int)comboBox2.SelectedItem;
int l = cx - 1;
int r = mx - cx;
int u = cy - 1;
int d = my - cy;
Bitmap bmp = new Bitmap(pictureBox1.Image);
Color color;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
for (int j = -u; j <= d; j++) {
for (int i = -l; i <= r; i++) {
if (x + i >= 0 && x + i < w && y + j >= 0 && y + j < h) {
color = bmp.GetPixel(x + i, y + j);
c1 = Convert.ToDouble(color.R);
c2 = Convert.ToDouble(color.G);
c3 = Convert.ToDouble(color.B);
RGBtoHSV(color, out c1, out c2, out c3);
for (int t = 1; t <= Convert.ToInt16(textBox1.Lines[cy - 1 + j][cx - 1 + i].ToString()); t++) {
list.Add(c3); }
}
}
}
list.Sort();
if (list.Count() % 2 == 0)
{
c3 = (list[(list.Count() / 2) - 1] + list[(list.Count() / 2)]) / 2;
}
else
{
c3 = list[(list.Count() - 1) / 2];
}
HSVtoRGB(c1, c2, c3);
bmp.SetPixel(x, y, Color.FromArgb(x1, x2, x3));
list.Clear();
}
button2.Text = Math.Round((double)y / (double)h * 100, 0).ToString() + " %";
Invalidate();
Application.DoEvents();
}
pictureBox1.Image = bmp;
button2.Text = "Фильтр";Решение задачи: «Падение производительности метода обработки изображения»
textual
Листинг программы
for (int t = 1; t <= Convert.ToInt16(textBox1.Lines[cy - 1 + j][cx - 1 + i].ToString()); t++)