Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Свертка

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


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Ambox content.png Черновик


Описание[1]

Применяет к фрагменту изображения матрицу свертки (конволюции). Фрагмент для преобразования задается при помощи перемещения мышки по экрану.

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

Пример

  1. PImage img;
  2. int w = 120;
  3.  
  4. // Матриц свертки (конволюции) существует огромное количество,
  5. // и с их помощью на изображения можно накладывать различные эффекты.
  6. // В данном скетче мы имеем дело с высокочастотным фильтром,
  7. // который выделяет края объектов.
  8. float[][] matrix = { { -1, -1, -1 },
  9.                      { -1,  9, -1 },
  10.                      { -1, -1, -1 } };
  11.  
  12. void setup() {
  13.   size(640, 360);
  14.   img = loadImage("moon-wide.jpg");
  15. }
  16.  
  17. void draw() {
  18.   // Мы будем обрабатывать только часть изображения,
  19.   // поэтому давайте сначала поставим всё изображение в качестве фона:
  20.   image(img, 0, 0);
  21.  
  22.   // Рассчитываем маленький квадрат,
  23.   // пиксели в котором мы будем обрабатывать:
  24.   int xstart = constrain(mouseX - w/2, 0, img.width);
  25.   int ystart = constrain(mouseY - w/2, 0, img.height);
  26.   int xend = constrain(mouseX + w/2, 0, img.width);
  27.   int yend = constrain(mouseY + w/2, 0, img.height);
  28.   int matrixsize = 3;
  29.   loadPixels();
  30.   // При помощи двух циклов for()
  31.   // проходим через каждый пиксель в квадратном фрагменте:
  32.   for (int x = xstart; x < xend; x++) {
  33.     for (int y = ystart; y < yend; y++ ) {
  34.       color c = convolution(x, y, matrix, matrixsize, img);
  35.       int loc = x + y*img.width;
  36.       pixels[loc] = c;
  37.     }
  38.   }
  39.   updatePixels();
  40. }
  41.  
  42. color convolution(int x, int y, float[][] matrix, int matrixsize, PImage img)
  43. {
  44.   float rtotal = 0.0;
  45.   float gtotal = 0.0;
  46.   float btotal = 0.0;
  47.   int offset = matrixsize / 2;
  48.   for (int i = 0; i < matrixsize; i++){
  49.     for (int j= 0; j < matrixsize; j++){
  50.       // пиксель, над которым мы сейчас работаем:
  51.       int xloc = x+i-offset;
  52.       int yloc = y+j-offset;
  53.       int loc = xloc + img.width*yloc;
  54.       // делаем так, чтобы не выходить за пределы изображения:
  55.       loc = constrain(loc,0,img.pixels.length-1);
  56.       // рассчитываем свертку:
  57.       rtotal += (red(img.pixels[loc]) * matrix[i][j]);
  58.       gtotal += (green(img.pixels[loc]) * matrix[i][j]);
  59.       btotal += (blue(img.pixels[loc]) * matrix[i][j]);
  60.     }
  61.   }
  62.   // ограничиваем диапазоны RGB-значений до 0-255:
  63.   rtotal = constrain(rtotal, 0, 255);
  64.   gtotal = constrain(gtotal, 0, 255);
  65.   btotal = constrain(btotal, 0, 255);
  66.   // возвращаем итоговый цвет:
  67.   return color(rtotal, gtotal, btotal);
  68. }

См.также

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

  1. processing.org - Convolution by Daniel Shiffman.