Простые и эффективные способы реализации размытия рамки при обработке изображений

Размытие по рамке, также известное как среднее размытие, – это популярный метод обработки изображений, который помогает создать на изображениях плавный и смягченный эффект. Он включает в себя усреднение значений пикселей в заданной области для получения размытого результата. В этой статье мы рассмотрим несколько методов реализации размытия поля, попутно предоставляя примеры кода и пояснения. Давайте погрузимся!

Метод 1: наивное размытие по рамке
Самый простой подход к реализации размытия по рамке — это перебор каждого пикселя изображения и вычисление среднего значения соседних пикселей. Вот фрагмент кода на Python:

import numpy as np
def box_blur_naive(image, kernel_size):
    height, width = image.shape[:2]
    blurred_image = np.zeros_like(image, dtype=np.uint8)
    for y in range(height):
        for x in range(width):
            neighbors = image[max(0, y - kernel_size):min(height, y + kernel_size + 1),
                             max(0, x - kernel_size):min(width, x + kernel_size + 1)]
            blurred_image[y, x] = np.mean(neighbors)
    return blurred_image

Метод 2: размытие по разделяемому рамке
Более эффективный подход — использовать свойство разделяемости ядра размытия по рамке. Применяя размытие по горизонтали и вертикали за два отдельных прохода, мы можем добиться того же результата с меньшим количеством вычислений. Вот пример на JavaScript:

function boxBlurSeparable(image, kernelSize) {
    const width = image.width;
    const height = image.height;
    const blurredImage = new Image(width, height);
    // Horizontal blur pass
    for (let y = 0; y < height; y++) {
        for (let x = 0; x < width; x++) {
            let sum = 0;
            for (let kx = -kernelSize; kx <= kernelSize; kx++) {
                const nx = Math.max(0, Math.min(width - 1, x + kx));
                sum += image.getPixel(nx, y);
            }
            blurredImage.setPixel(x, y, sum / (2 * kernelSize + 1));
        }
    }
// Vertical blur pass
    for (let y = 0; y < height; y++) {
        for (let x = 0; x < width; x++) {
            let sum = 0;
            for (let ky = -kernelSize; ky <= kernelSize; ky++) {
                const ny = Math.max(0, Math.min(height - 1, y + ky));
                sum += blurredImage.getPixel(x, ny);
            }
            blurredImage.setPixel(x, y, sum / (2 * kernelSize + 1));
        }
    }
    return blurredImage;
}

Метод 3: размытие по Гауссу
Размытие по Гауссу – это широко используемый метод размытия, который очень похож на размытие по прямоугольнику, но дает более плавный результат. Он применяет средневзвешенное значение к соседним пикселям, придавая большее значение центральным пикселям. Вот реализация на C++:

#include <opencv2/opencv.hpp>
cv::Mat gaussianBlur(const cv::Mat& image, int kernelSize) {
    cv::Mat blurredImage;
    cv::GaussianBlur(image, blurredImage, cv::Size(kernelSize, kernelSize), 0);
    return blurredImage;
}

В этой статье мы рассмотрели различные методы реализации размытия рамки при обработке изображений. Мы начали с простого подхода, а затем обсудили более эффективный метод размытия разделяемого прямоугольника. Наконец, мы представили технику размытия по Гауссу как разновидность размытия по прямоугольнику. Применяя эти методы, вы можете добиться впечатляющих эффектов размытия в своих проектах по манипулированию изображениями. Удачи в экспериментах и ​​включении этих методов в свой код!