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

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

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

Начать курс

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

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

1. Библиотека CImg

CImg (C++ Image Processing Library) — это легковесная, кроссплатформенная библиотека для обработки изображений. Она распространяется в виде одного заголовочного файла (CImg.h), что делает её идеальной для быстрого прототипирования и небольших проектов. CImg поддерживает форматы BMP, JPEG, PNG, TIFF и другие, но для работы с ними требует установки дополнительных библиотек (например, libpng или libjpeg).

Основные возможности:

  • Загрузка, отображение и сохранение изображений.
  • Фильтры (размытие, резкость, медианный фильтр).
  • Геометрические преобразования (поворот, масштабирование, отражение).
  • Работа с цветовыми пространствами (RGB, HSV, Lab).
  • Рисование примитивов (линии, окружности, текст).

Пример: загрузка изображения и применение размытия

#include "CImg.h"
using namespace cimg_library;

int main() {
    // Загружаем изображение
    CImg<unsigned char> image("input.jpg");

    // Применяем размытие по Гауссу (радиус 3)
    CImg<unsigned char> blurred = image.get_blur(3);

    // Сохраняем результат
    blurred.save("output_blurred.jpg");

    return 0;
}

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

2. Библиотека OpenCV

OpenCV (Open Source Computer Vision Library) — это де-факто стандарт для задач компьютерного зрения и обработки изображений в C++. Она включает более 2500 оптимизированных алгоритмов, поддерживает GPU-ускорение и активно используется в промышленных решениях, робототехнике и научных исследованиях. OpenCV работает с форматами JPEG, PNG, TIFF, WebP и многими другими.

Основные возможности:

  • Загрузка, отображение и запись видео/изображений.
  • Фильтрация, морфология, пороговая обработка.
  • Детектирование объектов (лиц, автомобилей) с помощью каскадов Хаара или глубокого обучения.
  • Калибровка камеры, стереозрение.
  • Машинное обучение (SVM, KNN, нейросети).

Пример: изменение размера и преобразование в оттенки серого

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

int main() {
    // Загружаем цветное изображение
    Mat image = imread("input.jpg", IMREAD_COLOR);
    if (image.empty()) {
        return -1;
    }

    // Преобразуем в оттенки серого
    Mat gray;
    cvtColor(image, gray, COLOR_BGR2GRAY);

    // Уменьшаем размер в 2 раза
    Mat resized;
    resize(gray, resized, Size(), 0.5, 0.5, INTER_LINEAR);

    // Сохраняем результат
    imwrite("output_gray_resized.jpg", resized);

    return 0;
}

OpenCV использует класс Mat для представления изображений. Все операции выполняются через статические функции или методы. Библиотека требует предварительной установки, но предоставляет максимальную гибкость и производительность.

3. Библиотека stb_image

stb_image — это часть набора однозаголовочных библиотек от Sean Barrett. Она предназначена исключительно для загрузки и сохранения изображений, без функций обработки. Поддерживает форматы JPEG, PNG, BMP, GIF, PSD и другие. Главное преимущество — невероятная простота интеграции: достаточно скопировать файл stb_image.h в проект и определить пару макросов.

Основные возможности:

  • Загрузка изображений в сырой массив пикселей (RGB или RGBA).
  • Сохранение изображений в форматах PNG, BMP, TGA, JPG (через stb_image_write.h).
  • Автоматическое преобразование в оттенки серого или RGBA.
  • Минимальный размер кода — идеально для встраиваемых систем.

Пример

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