как найти изображения полностью белого цвета?

Вопрос или проблема

Я проверил, что многие изображения на сайте полностью пусты, т. е. 500×500 с полностью белыми пикселями. Все изображения находятся в поддиректориях каталога изображений. Как я могу проверить, какие из них белые? Я думаю о том, чтобы получить имена этих изображений.

ОБНОВЛЕНИЕ:

  • Я хотел бы использовать какой-нибудь bash-скрипт или команду.
  • Imagemagick установлен
  • Сервер работает на Ubuntu 14.04
  • Все изображения имеют расширение .jpg

Если у вас есть — или вы можете установить — пакет ImageMagick, в нем есть утилита identify, которая может выводить гистограмму цветов в файле; приведенная ниже программа awk будет сканировать вывод команды identify -verbose для определения количества цветов и цвета, указанные в гистограмме. Если указан только один цвет и единственный цвет в гистограмме – белый, то она вернет “успех”, иначе “неудача”.

Вы затем можете обернуть shell-скрипт вокруг awk и identify для пометки совпадающих файлов:

for f in images/*
do
  identify -verbose "$f" | awk -f iswhite.awk && echo "$f is an all-white image"
done

iswhite.awk:

/Histogram:/ {
  inhisto=1
}
inhisto && /[[:digit:]]+: \([ [:digit:]]{3},[ [:digit:]]{3},[ [:digit:]]{3}\) #/ {
  if ($0 !~ /#FFFFFF white/) { nonwhite=1 }
}
/Rendering intent/ {
  inhisto=0
}
/Colors: / {
  ncolors=$2
}
END {
  if (ncolors == 1 && nonwhite == 0) { exit 0 } else { exit 1 }
}

Используя findimagedupes:

# Искать и сравнивать изображения, которые на 90% похожи 
# во всех поддиректориях текущего каталога.
findimagedupes -R -- .

Опция -t управляет тем, насколько похожи изображения:

# То же, что и раньше, но для изображений, которые на 99% похожи.
findimagedupes -t 99 -R -- .

Предположим, в каталоге есть такие файлы:

white.png foo.png. bar.png. baz.jpg green.png

…где white.png заведомо белый, green.png заведомо зеленый, а остальные под вопросом. Поскольку findimagedupes выводит любые похожие файлы на одной строке (разделенные пробелами), это покажет только белые:

findimagedupes -t 100 -R -- . | grep -w white.png

Вывод (предполагая, что bar.png белый):

white.png bar.png

См. также: Инструмент командной строки для проверки, одинаковы ли два изображения графически, и более общая тема: Умный поисковик дубликатов файлов для Linux.

Следующая команда скажет вам значение самого темного пиксела в изображении:

magick YOURIMAGE.jpg -format "%[min]" info:

Если изображение JPEG белое, это значение будет 255.


Если ваши изображения, например, 16-битные PNG (я знаю, что у вас в настоящее время JPEG, но это касается других читателей), значение белого будет 65 535, а не 255. Вместо написания двух тестовых случаев, вы можете инвертировать изображение, чтобы белый (255 или 65 535) стал черным (0), а затем поискать самый яркий пиксель, который будет нулем в обоих случаях, если исходное изображение было белым:

magick YOURIMAGE.jpg -negate -format "%[max]" info:

Ответ или решение

В качестве эксперта в области информационных технологий, я предлагаю вам комплексное решение для поиска полностью белых изображений на вашем сервере. Вы упомянули, что используете Ubuntu 14.04, у вас установлена библиотека ImageMagick, и все изображения имеют расширение .jpg. Мы рассмотрим подход, основанный на использовании утилит командной строки и инструментов ImageMagick для автоматизации этого процесса.

Теоретическая основа

В теории, полностью белое изображение означает, что каждый пиксель имеет максимально возможное значение. В случае изображений в формате JPEG в 8-битном цветовом пространстве RGB, значение белого составляет (255, 255, 255) для каждого пикселя. Это же справедливо и для монохромных изображений, где белый цвет представлен значением 255.

ImageMagick предоставляет мощные инструменты для анализа изображений, включая identify, который позволяет извлечь подробную статистику, такую как количество уникальных цветов и их распределение в изображении. Из этого следует, что если изображение имеет только один уникальный цвет — белый, то оно полностью белое. Другой подход заключается в инверсии изображения с последующей проверкой на присутствие черного цвета; если оно инвертировано в черное, исходное изображение было белым.

Пример использования

Используем ImageMagick для анализа изображений с помощью скрипта на Bash и awk. Шаги следующие:

  1. Скрипт на Bash: Мы создаем цикл, который проходит через все изображения, используя команду identify -verbose для извлечения гистограммы изображения. Затем awk анализирует, содержит ли гистограмма только белые пиксели.
for f in images/*; do
  identify -verbose "$f" | awk -f iswhite.awk && echo "$f is an all-white image"
done
  1. awk для анализа: Создаем исполняемый файл iswhite.awk для анализа. Этот скрипт будет проверять, содержит ли гистограмма только белый цвет.
/Histogram:/ {
  inhisto=1
}
inhisto && /[[:digit:]]+: \([ [:digit:]]{3},[ [:digit:]]{3},[ [:digit:]]{3}\) #/ {
  if ($0 !~ /#FFFFFF white/) { nonwhite=1 }
}
/Rendering intent/ {
  inhisto=0
}
/Colors: / {
  ncolors=$2
}
END {
  if (ncolors == 1 && nonwhite == 0) { exit 0 } else { exit 1 }
}

Этот сценарий проверяет наличие только одного цвета — белого, и возвращает успех, если это так.

Практическое применение

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

Еще один инструмент, который может быть полезен — findimagedupes. В реальных условиях может возникнуть необходимость в идентификации изображений с определенной степенью схожести. Допустим, вы хотите сравнить изображения на предмет полного дубликата или схожести на 99%.

findimagedupes -t 99 -R -- .

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

Подведение итогов

Таким образом, автоматизация процесса проверки на полностью белые изображения может существенно повысить эффективность управления файловой системой и снизить затраты на хранение благодаря удалению необоснованно больших файлов, которые содержат несущественные данные. Благодаря универсальности утилит ImageMagick и findimagedupes, вы обладаете мощным инструментарием для реализации подобных задач в среде Ubuntu. Понимание этих процессов позволит вам мгновенно управлять и оптимизировать файловую систему, сохраняя важные ресурсы и улучшая общую производительность системы.

Оцените материал
Добавить комментарий

Капча загружается...