2017-02-14 4 views
8

В приложении содержится около 1 миллиарда изображений PNG (размер 1024 * 1024 и около 1 МБ каждый), он должен объединять 1 миллиард изображений с огромным изображением, а затем создает размер 1024 * 1024 унитарное миниатюра для него , Или, может быть, нам не нужно действительно комбинировать изображения с огромными, но просто сделать какой-то волшебный алгоритм для создания унифицированного эскиза в памяти компьютера? Между тем этот процесс нужно делать как можно быстрее, лучше в секундах или, по крайней мере, через несколько минут. У кого-нибудь есть идея?Как создать единый миниатюру для миллиарда изображений png?

enter image description here

+2

США млрд ('10 ** 9') или ЕС млрд (' 10 ** 12')? – alk

+0

Значит миллиард, огромное количество. – Suge

+0

Что вы подразумеваете под * унитарным эскизом * и с какой целью? – user694733

ответ

3

ImageMagick можно сделать:

montage -tile *.png tiled.png

Если вы не хотите использовать внешний помощник по какой-либо причине, вы все еще можете использовать источники.

+0

Это очень медленно для большого количества изображений в моем тестировании, любое предложение? – Suge

+0

Итак, на кластере машин, используя монтаж (с -resize), можно объединить изображения. Поэтому для достижения ваших целей вы сначала создадите набор заданий nxn и запустите их, а затем на сгенерированные монтажи, повторите, пока вы не останетесь с одним монтажом. – mksteve

9

Идея загрузки миллиарда изображений в один процесс montage нелепо. Ваш вопрос непонятен, но ваш подход должен заключаться в определении количества пикселей каждого исходного изображения в конечном изображении, а затем извлечение необходимого количества пикселей из каждого изображения параллельно. Затем соберите эти пиксели в конечное изображение.

Итак, если каждое изображение будет представлено одним пиксела в конечном изображении, вам нужно, чтобы получить среднее значение каждого изображения, которое вы можете сделать так:

convert image1.png image2.png ... -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info: 

Пример вывода

0.423529,0.996078,0:image1.png 
0.0262457,0,0:image2.png 

Вы можете сделать это, то очень быстро параллельно с GNU Parallel, используя что-то вроде

find . -name \*.png -print0 | parallel -0 convert {} -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info: 

Тогда вы можете сделать окончательное изображение и поместить отдельные пиксели.

Сканирование даже 1,000,000 PNG файлов, вероятно, займет много часов ...

Вы не говорите, как большие ваши изображения но если они имеют порядок 1 МБ каждый, и у вас есть 1 000 000 000, то вам нужно сделать петабайт ввода-вывода, чтобы читать их, поэтому даже при сверхбыстрой SSD-памяти 500 МБ вы будете там 23 дня ,

+0

Если изображения с черепицей будут загружены от разных клиентов, полезно ли представить пиксель представления на клиенте перед загрузкой, а затем собрать пиксели для изображения на сервере? Будет ли этот путь очень быстрым? – Suge

+1

Ответ зависит от вашей среды, которую, к сожалению, я не могу понять с текущим описанием. Если есть 1 000 000 000 клиентов, каждый из которых отправляет вам изображение, для каждого из них будет разумным отправить вам минимально необходимый. Если только 1024 клиента, каждый из которых обеспечивает 1 000 000 изображений, для каждого клиента будет разумно разработать целый блок для вас, но вы не можете этого сделать, если каждый клиент отправляет только одно изображение. В общем, чем больше машин вы можете работать над отдельными частями, тем лучше. –

+2

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

3

Рандомизированный алгоритм, такой как случайная выборка, может быть осуществимым.

Учитывая, что объединенное изображение настолько велико, любой линейный алгоритм может потерпеть неудачу, не говоря уже о более сложном методе.

По расчетам мы можем сделать вывод, что каждый пиксель эскиза зависит от 1000 изображений. Таким образом, остаточный результат выборки не влияет на результат.

Описание алгоритма может следующим образом:

Для каждого пикселя эскиза координат, произвольно выбирать N изображения, которые на месте, и соответствуют каждой выборки изображения M пикселей, а затем рассчитать их среднее значение. Сделайте то же самое для других пикселей эскизов.

Однако, если ваши изображения случайным образом объединены, результат, как правило, составляет 0,5 значащего изображения в оттенках серого.Потому что по Центральной предельной теореме дисперсия пикселя уменьшенного изображения имеет нулевое значение. Таким образом, вы убедитесь, что комбинированный эскиз структурирован сам.

PS: с помощью OpenCV будет хорошим выбором

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