@SavaLLL

Как найти красный квадрат на сером фоне (C#)?

Есть jpg картинка 300x200, фон серый , на ней есть красный квадрат примерно в 10 пикселей.
Мне необходимо найти центр этого квадрата.
Сейчас я реализую это так:

1. Попиксельно ищу точки с близким к красному цветом.
2. Нахожу самый левый-верхний пиксель и самый правый-нижний пиксель.
3. Потом складываю их координаты и делю пополам.

Но это получается слишком долго, и поедает очень много ресурсов. (Таких картинок очень много в нескольких потоках)
Каким другим способом можно решить мою задачу? Или какие поправки можно внести в существующий алгоритм?
  • Вопрос задан
  • 439 просмотров
Решения вопроса 2
@poiuy7
Задача решается за один проход по картинки (тоесть 200*300 операций) у вас так?
Можно сначала делать проход с неким шагом например 3 (это даст прирост в 9 раз)
при обнаружении первой точки далее сканировать только локальную область (не ходить дальше)

Но я думаю что у вас большую часть времени тратится не на поиск, а на преопразование jpg в объект (массив) для дальнейшей обработки

Еще хотел добавить, что если качество картинки будет не очень (с артефактами), то ваш алгоритм может выдавать не верные ответы.
Более надежно работать с проекциями. Тоесть:
1) За первый проход делаем проекцию (сумму) красного градиента на оси X и Y
2) Затем усредняем проекции (например с окном 5, мешьше чем размер возможно квадрата)
3) Ищем среднее среди максимумов проекций
Это с вычислительной точки зрения больше чем у вас (но не намного), но более надежный метод.
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Посмотрите на LockBitmapData (работа со строчками Bitmap напрямую). Там можно работать гораздо быстрее, чем через GetPixel.
И действительно, ищите красные точки с шагом 4 или 5 (можно и 8, но есть риск промахнуться, если квадрат оказался чуть меньше).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы