Как автоматически повернуть прямоугольную область изображения на несколько градусов так, чтобы её левая сторона стала вертикальной (используя инструменты командной строки, такие как ImageMagick)

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

У меня есть несколько тысяч изображений, чьи основные характеристики, как на прикрепленной картинке: все изображения находятся в (почти) черной рамке, в то время как фактическое содержание изображений почти всегда на белом фоне.

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

Учитывая количество изображений, которые я хотел бы обработать таким образом, предполагаю, что мне придется делать это с помощью инструментов командной строки. В прошлом я использовал ImageMagick для таких заданий (для преобразований, которые намного проще), но мне действительно не помешало бы объединить несколько различных инструментов для достижения цели.

Что я уже пробовал:

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

Чтобы объяснить более подробно, я хотел бы:

  1. Обнаружить левую границу между черной рамкой и областью, содержащей фактическое содержание изображения.
  2. Провести (невидимую) прямую линию вдоль этой границы.
  3. Определить угол между этой линией и вертикальной линией.
  4. Повернуть всё изображение на (отрицательный) угол так, чтобы край из пункта 1 стал вертикальным.
  5. Обрезать изображение, удаляя как можно больше черной рамки, но сохраняя полную область, которая содержит фактическое содержание (и, таким образом, принимая, что остатки черной рамки сохраняются, если эта область не идеально прямоугольная).

Может кто-то объяснить, как это сделать, желательно с использованием инструментов командной строки?

введите описание изображения здесь

Для вашего простого и чистого примера вы можете сделать следующее; используйте imagemagick trim для удаления большей части внешней рамки, затем попробуйте повернуть на 1 градус (добавив подходящий черный фон к вновь добавленным пикселям теперь уже большего изображения), снова обрезать и посмотреть, уменьшился ли размер изображения. Выберите наилучший уменьшенный размер.

file=in.png
convert "$file" -trim out.png
minwidth=$(identify -format '%w' out.png)
minrot=0
for rot in $(seq 1 30)
do      convert out.png -background black -rotate -"$rot" out2.png
        convert out2.png -trim out3.png
        width=$(identify -format '%w' out3.png)
        echo "$rot degrees, width $width"
        if [ $width -lt $minwidth ]
        then    minwidth=$width minrot=$rot
        else    break
        fi
done
echo "choose rotate $minrot for min width $minwidth"
convert out.png -background black -rotate -"$minrot" out2.png
convert out2.png -trim result.png
display result.png

Для тестового изображения я получил:

1 degree, width 381
2 degrees, width 375
3 degrees, width 369
4 degrees, width 363
5 degrees, width 355
6 degrees, width 359
choose 5 width=355

повернутое изображение с текстом со стрелками

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

Автоматическая ротация и обрезка изображений с использованием ImageMagick

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

Шаг 1: Удаление черной рамки

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

file=in.png
convert "$file" -trim out.png

Шаг 2: Поиск оптимального угла поворота

После удаления черной рамки, мы используем цикл для автоматического поворота изображения на 1-30 градусов в отрицательном направлении (по часовой стрелке). Параметр -background black гарантирует, что добавляемые пиксели (в результате поворота) будут черного цвета. Затем мы снова применим обрезку для получения нового изображения и проверим его ширину. Мы будем следить за тем, чтобы ширина уменьшалась, пока не достигнем оптимального угла, при котором минимизируем ширину обрезанного изображения.

minwidth=$(identify -format '%w' out.png)
minrot=0
for rot in $(seq 1 30)
do      
    convert out.png -background black -rotate -"$rot" out2.png
    convert out2.png -trim out3.png
    width=$(identify -format '%w' out3.png)
    echo "$rot degrees, width $width"

    if [ $width -lt $minwidth ]
    then    
        minwidth=$width 
        minrot=$rot
    else    
        break
    fi
done
echo "choose rotate $minrot for min width $minwidth"

Шаг 3: Применение найденного угла и финальная обрезка

Как только мы нашли minrot, оптимальный угол поворота, мы можем применить его к изображению и выполнить окончательную обрезку:

convert out.png -background black -rotate -"$minrot" out2.png
convert out2.png -trim result.png
display result.png

Полный скрипт

file=in.png
convert "$file" -trim out.png
minwidth=$(identify -format '%w' out.png)
minrot=0

for rot in $(seq 1 30)
do      
    convert out.png -background black -rotate -"$rot" out2.png
    convert out2.png -trim out3.png
    width=$(identify -format '%w' out3.png)
    echo "$rot degrees, width $width"

    if [ $width -lt $minwidth ]
    then    
        minwidth=$width 
        minrot=$rot
    else    
        break
    fi
done

echo "choose rotate $minrot for min width $minwidth"
convert out.png -background black -rotate -"$minrot" out2.png
convert out2.png -trim result.png
display result.png

Заключение

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

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

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