Обработка изображений на C++: библиотеки CImg, OpenCV и Magick++

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в C++: обзор библиотек и практические примеры

Обработка цифровых изображений — одна из ключевых задач современного программирования. В C++ существует несколько мощных библиотек, позволяющих загружать, изменять, анализировать и сохранять изображения. В этой статье мы рассмотрим три наиболее популярных инструмента: CImg (лёгкая и простая), OpenCV (промышленный стандарт для компьютерного зрения) и GraphicsMagick (для высокопроизводительной конвертации).

1. CImg — лёгкая библиотека для базовых операций

CImg (The C++ Template Image Processing Library) — это заголовочная библиотека, не требующая установки дополнительных DLL. Она идеально подходит для учебных проектов и быстрого прототипирования. Поддерживает форматы BMP, PNG, JPEG, TIFF (через внешние кодеки).

Установка

Достаточно скачать файл CImg.h и подключить его в проект. Для работы с JPEG/PNG потребуются также libjpeg, libpng и zlib.

Пример: загрузка, инверсия цветов и сохранение

#include "CImg.h"
using namespace cimg_library;

int main() {
    // Загружаем изображение
    CImg<unsigned char> img("input.jpg");
    
    // Инвертируем цвета (пиксель = 255 - пиксель)
    CImg<unsigned char> inverted = 255 - img;
    
    // Применяем размытие по Гауссу (радиус 3)
    CImg<unsigned char> blurred = img.get_blur(3);
    
    // Сохраняем результаты
    inverted.save("inverted.jpg");
    blurred.save("blurred.jpg");
    
    return 0;
}

2. OpenCV — мощный фреймворк для компьютерного зрения

OpenCV (Open Source Computer Vision Library) — де-факто стандарт для задач распознавания, детекции объектов и сложной обработки изображений. Поддерживает сотни алгоритмов, работу с видео, нейронными сетями. Является кроссплатформенным.

Установка

На Ubuntu: sudo apt install libopencv-dev. На Windows — через vcpkg или официальный установщик.

Пример: обнаружение границ (Canny) и изменение размера

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // Чтение изображения
    Mat img = imread("photo.jpg");
    if (img.empty()) return -1;
    
    // Преобразование в оттенки серого
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);
    
    // Обнаружение границ алгоритмом Canny
    Mat edges;
    Canny(gray, edges, 50, 150);
    
    // Изменение размера до 300x300
    Mat resized;
    resize(img, resized, Size(300, 300));
    
    // Сохранение и показ
    imwrite("edges.jpg", edges);
    imshow("Original", img);
    waitKey(0);
    
    return 0;
}

3. GraphicsMagick — быстрая конвертация и пакетная обработка

GraphicsMagick — форк ImageMagick, ориентированный на стабильность и производительность. Используется для массовой конвертации, изменения размера, водяных знаков. Работает с более чем 200 форматами.

Установка

Через пакетный менеджер: sudo apt install graphicsmagick. Для C++ требуется библиотека libgraphicsmagick++-dev.

Пример: уменьшение изображения и конвертация в PNG

#include <Magick++.h>
using namespace Magick;

int main() {
    InitializeMagick(nullptr);
    
    // Загрузка изображения
    Image image("input.tiff");
    
    // Масштабирование до 800 пикселей по ширине
    image.scale(Geometry("800x"));
    
    // Поворот на 90 градусов
    image.rotate(90);
    
    // Установка качества JPEG (если выходной формат JPEG)
    image.quality(85);
    
    // Сохранение в PNG
    image.write("output.png");
    
    return 0;
}

Сравнение библиотек

  • CImg — простой старт, минимум зависимостей, подходит для обучения и простых фильтров.
  • OpenCV — максимальная функциональность (фильтры, детекторы, ML), сложнее в сборке, но незаменим для серьёзных проектов.
  • GraphicsMagick — лучший выбор для конвертации форматов и пакетной обработки, высокая скорость.

Рекомендации по выбору

Рекомендаций