Processing:Примеры/Обнаружение границ объектов

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

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


Описание[1]

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

Этот скетч в данный момент плохо работает в режиме JavaScript.

Пример

float[][] kernel = {{ -1, -1, -1}, 
                    { -1,  9, -1}, 
                    { -1, -1, -1}};
                    
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]);
          // умножаем цветовое значение пикселя
          // на значение внутри матрицы (1/9 = 0.111...),
          // а затем суммируем результаты 9 пикселей матрицы,
          // получая в результате «суммарный цвет»
          // в виде переменной «sum»:
          sum += kernel[ky+1][kx+1] * val;
        }
      }
      // задаем этот монохромный «суммарный цвет»
      // соответствующему пикселю на новом изображении:
      edgeImg.pixels[y*img.width + x] = color(sum, sum, sum);
    }
  }
  // обновляем данные внутри массива «edgeImg.pixels[]»:
  edgeImg.updatePixels();
  image(edgeImg, width/2, 0); // рисуем новое изображение
}

См.также

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