Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

Как нормально исключить из области обработки изображения некоторый массив 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. - исключаемые области изначально задаются кругами с рандомным радиусом. Но что проверять, входит ли точка в один из кругов, что проверять, есть ли она среди массива, содержащего все точки этих кругов, по времени выходит одно


Ответ

Есть два пути ускорения.
Во-первых, можно вместо линейной по количеству проверяемых точек проверке на вхождение в List (или Point[]) собрать точки в HashSet, у которого проверка на вхождение очень быстрая (O(1)).
Во-вторых, для работы с изображениями лучше всего отказаться от очень медленного GetPixel/SetPixel. Вместо этого имеет смысл получить «сырые» данные, используя LockBits (в статье на MSDN есть хороший пример), и работать с ними.

Комментариев нет:

Отправить комментарий