Обработка изображений в Java: библиотеки и примеры кода

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

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

Начать курс

Работа с изображениями в Java: полный обзор библиотек и инструментов

Java предоставляет мощные средства для работы с растровыми изображениями — от простой загрузки и сохранения до сложной обработки с использованием фильтров и нейросетей. В этой статье мы разберём три основных подхода: встроенную библиотеку Java 2D, специализированную ImageJ и промышленный стандарт OpenCV. Вы узнаете, как выбрать подходящий инструмент и увидите рабочие примеры кода.

1. Встроенная библиотека Java 2D (javax.imageio, java.awt)

Java 2D — это часть стандартной библиотеки Java (JDK). Она не требует установки дополнительных зависимостей и идеально подходит для базовых операций: загрузка, изменение размера, обрезка, наложение текста и простые фильтры.

Основные классы:

  • javax.imageio.ImageIO — чтение и запись изображений (PNG, JPEG, BMP, GIF, WBMP).
  • java.awt.image.BufferedImage — представление изображения в памяти с доступом к пикселям.
  • java.awt.Graphics2D — контекст для рисования (масштабирование, поворот, наложение).
  • java.awt.image.BufferedImageOp — интерфейс для фильтров (размытие, контраст, цветокоррекция).

Пример 1: Загрузка, изменение размера и сохранение

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageResizer {
    public static void main(String[] args) throws IOException {
        // Загружаем исходное изображение
        BufferedImage original = ImageIO.read(new File("input.jpg"));

        // Новые размеры (например, уменьшаем до 300x200)
        int newWidth = 300;
        int newHeight = 200;

        // Создаём новое изображение с нужными размерами
        BufferedImage resized = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = resized.createGraphics();

        // Рисуем исходное изображение с масштабированием
        g2d.drawImage(original, 0, 0, newWidth, newHeight, null);
        g2d.dispose();

        // Сохраняем результат
        ImageIO.write(resized, "jpg", new File("output.jpg"));
        System.out.println("Готово! Размер изменён.");
    }
}

Пример 2: Применение встроенного фильтра (размытие)

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;

public class BlurFilter {
    public static void main(String[] args) throws Exception {
        BufferedImage img = ImageIO.read(new File("input.jpg"));

        // Ядро размытия 3x3 (box blur)
        float[] blurKernel = {
            1f/9f, 1f/9f, 1f/9f,
            1f/9f, 1f/9f, 1f/9f,
            1f/9f, 1f/9f, 1f/9f
        };
        Kernel kernel = new Kernel(3, 3, blurKernel);
        ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
        BufferedImage blurred = convolve.filter(img, null);

        ImageIO.write(blurred, "jpg", new File("blurred.jpg"));
    }
}

2. Библиотека ImageJ — для научных и медицинских изображений

ImageJ — это популярный инструмент для обработки изображений, изначально написанный на Java. Он предоставляет сотни готовых плагинов, макросов и мощный API. Отлично подходит для анализа микроскопии, спутниковых снимков и любых задач, где нужна статистика по пикселям.

Подключение (Maven):

<dependency>
    <groupId>net.imagej</groupId>
    <artifactId>ij</artifactId>
    <version>1.53t</version>
</dependency>

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

import ij.IJ;
import ij.ImagePlus;
import ij.process.ImageProcessor;

public class ImageJThreshold {
    public static void main(String[] args) {
        // Открываем изображение
        ImagePlus imp = IJ.openImage("microscope.tif");
        ImageProcessor ip = imp.getProcessor();

        // Преобразуем в градации серого
        ip.convertToByte(false);

        // Применяем порог (Otsu)
        ip.setAutoThreshold("Otsu", true, ImageProcessor.BLACK_AND_WHITE);

        // Сохраняем результат
        IJ.save(imp, "thresholded.tif");
        System.out.println("Пороговая обработка выполнена.");
    }
}

ImageJ также умеет работать со стеком изображений (3D/4D),

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