Processing:Примеры/Размытие

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Описание[1]

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

Пример

float v = 1.0 / 9.0;
float[][] kernel = {{ v, v, v }, 
                    { v, v, v }, 
                    { v, v, v }};
                    
PImage img;

void setup() {
  size(640, 360);
  img = loadImage("moon.jpg"); // загружаем исходное изображение
  noLoop();
} 

void draw() {
  image(img, 0, 0); // рисуем изображение на точке (0,0) 
  img.loadPixels();

  // создаем непрозрачное изображение
  // того же размера, что и оригинал:
  PImage edgeImg = createImage(img.width, img.height, RGB);

  // при помощи двух циклов for()
  // поочередно проходим через каждый пиксель на экране:
  for (int y = 1; y < img.height-1; y++) {   // пропускаем верхний
                                             // и нижний края
    for (int x = 1; x < img.width-1; x++) {  // пропускаем левый
                                             // и правый края
      float sum = 0; // переменная, хранящая «суммарный цвет»,
                     // который будет задан текущему пикселю-ядру
      for (int ky = -1; ky <= 1; ky++) {
        for (int kx = -1; kx <= 1; kx++) {
          // рассчитываем позицию очередного пикселя матрицы; 
          // всего для текущего пикселя-ядра
          // будут рассчитаны позиции для 9 пикселей:
          int pos = (y + ky)*img.width + (x + kx);
          // это монохромное изображение,
          // поэтому красный, зеленый и синий каналы идентичны:
          float val = red(img.pixels[pos]);
          // умножаем считанное значение очередного пикселя матрицы
          // на значение в массиве «kernel» (1/9 = 0,111...);
          // затем итоговые значения всех 9 пикселей будут сложены,
          // а результат будет записан в переменную «sum»:
          sum += kernel[ky+1][kx+1] * val;
        }
      }
      // задаем пикселю монохромный «суммарный цвет» 
      // (переменная «sum»), рассчитанный на основе
      // всех 9 пикселей матрицы:
      edgeImg.pixels[y*img.width + x] = color(sum);
    }
  }
  // обновляем пиксели в массиве «edgeImg.pixels[]»:
  edgeImg.updatePixels();

  image(edgeImg, width/2, 0); // рисуем новое изображение
}

См.также

Внешние ссылки