2016-10-17 4 views
0

Каков самый быстрый способ поиска определенного пикселя в изображении? Размер файла изображения составляет 16 МБ. С точки зрения алгоритма я не думаю, что смогу лучше, чем линейный поиск. Я попытался разбить изображение в 2 квадрантах 1 для каждого процессора и загрузить изображение в память и прочитать его оттуда. Есть ли что-нибудь еще, что я могу сделать?Самый быстрый способ поиска пикселя определенного пикселя в изображении

+0

Вы собираетесь выполнять несколько поисков по изображению или только один? – harold

+0

Один раз. Мне нужно подсчитать, сколько раз появляется определенный цвет – Xtal

+1

Что такое формат файла? Если он сжат (например, закодирована длина пробега), вы можете ускорить процесс, подсчитав пиксели при его распаковке, а не распаковывая всю вещь, а затем итерацию по изображению. Вам даже не нужно хранить распакованные результаты. – samgak

ответ

0

Обычно нет, единственное, что может улучшить:

Если для вашего приложения является преимуществом, когда вы получите первые результаты до того, как точный результат будет найден, вы можете улучшить следующим образом, но это усилие не может быть стоит время, которое вы инвестируете:

Шаг 1: поиск с шагом 2 или 3 пикселя. Дальнейший поиск возможен только тогда, когда цвета схожи. если найдено обратный пиксель.
Если не найден сделать
Шаг 2: поиск остальных пикселей (что вы overjumped в step1)

Но так как вычисление цветового сходства будет превышать прирост overumping несколько пикселей, это Algo что линейный поиск, скорее всего, будет лучшим решением.

0

Может быть какая-то стратегия приближения, чтобы обрезать или пропускать некоторый диапазон пикселей, где вероятность найти определенный пиксель менее вероятна. Но если вы закончите выполнять линейный поиск, вы можете, конечно, оптимизировать время поиска на диске Loop Blocking. Таким образом, вы можете максимально эффективно использовать основную память и уменьшать поиск на диске.

Вы также можете посмотреть статью от Intel improve memory utilization by means of loop blocking

1

Квадрантов на самом деле немного раздражают, они могут помочь, когда есть что-то пространственное происходит, но так как это только линейный поиск всех они делают это разбить хороший последовательный доступ к файлу , Таким образом, вы должны просто разделить изображение на 1D фрагменты памяти, игнорируя исходную 2D-информацию.

Кроме того, проверьте, является ли ваш код автогенерируемым компилятором, а если нет (или даже если это возможно, но возможно улучшение), вручную векторизовать с помощью встроенных SIMD-операций. 24bpp сделает это немного раздражающим, но вы можете справиться с ним, загрузив 48 байтов, а затем перераспределите это более 4 векторных регистров с некоторой перетасовкой. 32bpp очень просто, просто примените (при условии, что вы нацеливаете x86) _mm_cmpeq_epi32 между пикселями и цветом, который вы хотите найти, и вычтите результат из подсчета.

+0

Это путь. Если вы посмотрите на функцию OpenCV 'InRange()' она делает более или менее то, что вы хотите, и закодирована в intrinsics здесь ... https://github.com/opencv/opencv/blob/master/modules/core/src /arithm.cpp –

Смежные вопросы