@kir_cipher

Как нормально исключить из области обработки изображения некоторый массив Point (c#)?

Доброго времени суток, господа!
Суть вопроса состоит в следующем:
Я обрабатываю фото попиксельно:
Bitmap bit = new Bitmap(StartImage);
            Size size = bit.Size;
            for (int y = 0; y < size.Height; y++)
                for (int x = 0; x < size.Width; x++)
                {
                    Color c = bit.GetPixel(x, y);
                    ... Некоторые действия с пикселем ...
                 }

Понадобилась возможность исключать из области обработки некоторые области. Ну, я подумал, что, мол, фигня вопрос: сейчас задам на вход массив точек, которые обрабатывать не нужно, а перед получением пикселя и его обработкой поставлю if (ExceptPoints.Contains(new Point(x,y))) и дело в шляпе! Но не тут-то было. Метод начал работать просто до чертиков медленно (а когда для тестирования я выбрал для исключения половину всего изображения, я не дождался результата и в течение 4 минут). Попробовал реализовать многопоточность для решения этой задачи. Но чуть не спалил себе ЦП (99% загрузки) хД
В общем, нужно как-то сие дело оптимизировать (или реализовать некорявую многопоточность), но в голову не идут идеи, как же это сделать.
Так что обращаюсь к вам за советом по сему нелегкому делу!

P.S. - исключаемые области изначально задаются кругами с рандомным радиусом. Но что проверять, входит ли точка в один из кругов, что проверять, есть ли она среди массива, содержащего все точки этих кругов, по времени выходит одно
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Хотите скорости, то забудьте про GetPixel
Используйте Bitmap.LockBits
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
Если ExceptPoints - это list - то у него Contains достаточно долгий. Тем более вы в него еще и аллокацию делаете, и так на каждый пиксель - дичайшее количество проходов по массиву.
Быстрый вариант: для ExceptPoints использовать HashSet, но тут есть вопрос с сравнением экзепляров. Возможно не Point придется хранить, а кодировать в int. Что все равно быстрее.

Еще из вариантов - отсортировать ExceptPoints, и каждый раз поиск (Contains) начинать с предыдущей найденной точки. По сути - удаление из списка, но без удаления - потому что удаление тоже долго.

Опять таки сортировка может очень выручить - тут надо подумать.

Ну и самый простой вариант - это маска. Т.е. вы храните массив bool длины, равной количеству пикселей, где значение - это исключать или нет эту точку. Будет очень быстро, но неэкономно по памяти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы