Processing:Примеры/Свертка: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
Нет описания правки
 
(не показаны 3 промежуточные версии 2 участников)
Строка 1: Строка 1:
{{Processing панель перехода}}
{{Processing панель перехода}}
{{Перевод от Сubewriter}}
{{Перевод от Сubewriter}}
{{Myagkij-редактор}}
{{Myagkij-редактор}}
{{Черновик}}


=Описание<ref>[https://processing.org/examples/convolution.html processing.org - Convolution by Daniel Shiffman.]</ref>=
=Описание<ref>[https://processing.org/examples/convolution.html processing.org - Convolution by Daniel Shiffman.]</ref>=
Строка 117: Строка 114:
}}
}}


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
PImage img;
PImage img;
int w = 120;
int w = 120;
Строка 194: Строка 191:
<references />
<references />


{{SEO
{{Навигационная таблица/Портал/Processing}}
|Заголовок статьи=Processing: Свертка / Онлайн справочник - wikihandbk.com
|Ключевые слова=processing,Свертка ,Свертка в processing, пример Свертка, пример Свертка в processing
|Описание статьи=
|Изображение статьи для Open Graph=
|Адрес страницы для schemaNewsArticle=<nowiki>http://wikihandbk.com/wiki/Processing:Примеры/Свертка</nowiki>
|Изображение статьи для schemaNewsArticle=<nowiki></nowiki>
|Высота изображения статьи для schemaNewsArticle=
|Ширина изображения статьи для schemaNewsArticle=
|Дата публикации для schemaNewsArticle=2018-07-31
|Автор=Мякишев Е.А.
|Издатель=myagkij
|Логотип издателя для schemaNewsArticle=<nowiki>http://wikihandbk.com/ruwiki/images/6/61/Tech_geek_logo_1x.jpg</nowiki>
|Ширина логотипа издателя для schemaNewsArticle=60
|Высота логотипа издателя для schemaNewsArticle=45
}}
{{Навигационная таблица/Справочник языка Processing}}
{{Навигационная таблица/Processing/Примеры}}

Текущая версия от 07:57, 27 августа 2023

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


Описание[1]

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

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

Пример

PImage img;
int w = 120;

// Матриц свертки (конволюции) существует огромное количество, 
// и с их помощью на изображения можно накладывать различные эффекты.
// В данном скетче мы имеем дело с высокочастотным фильтром,
// который выделяет края объектов. 
float[][] matrix = { { -1, -1, -1 },
                     { -1,  9, -1 },
                     { -1, -1, -1 } }; 

void setup() {
  size(640, 360);
  img = loadImage("moon-wide.jpg"); 
}

void draw() {
  // Мы будем обрабатывать только часть изображения,
  // поэтому давайте сначала поставим всё изображение в качестве фона:
  image(img, 0, 0);
  
  // Рассчитываем маленький квадрат,
  // пиксели в котором мы будем обрабатывать:
  int xstart = constrain(mouseX - w/2, 0, img.width);
  int ystart = constrain(mouseY - w/2, 0, img.height);
  int xend = constrain(mouseX + w/2, 0, img.width);
  int yend = constrain(mouseY + w/2, 0, img.height);
  int matrixsize = 3;
  loadPixels();
  // При помощи двух циклов for() 
  // проходим через каждый пиксель в квадратном фрагменте:
  for (int x = xstart; x < xend; x++) {
    for (int y = ystart; y < yend; y++ ) {
      color c = convolution(x, y, matrix, matrixsize, img);
      int loc = x + y*img.width;
      pixels[loc] = c;
    }
  }
  updatePixels();
}

color convolution(int x, int y, float[][] matrix, int matrixsize, PImage img)
{
  float rtotal = 0.0;
  float gtotal = 0.0;
  float btotal = 0.0;
  int offset = matrixsize / 2;
  for (int i = 0; i < matrixsize; i++){
    for (int j= 0; j < matrixsize; j++){
      // пиксель, над которым мы сейчас работаем:
      int xloc = x+i-offset;
      int yloc = y+j-offset;
      int loc = xloc + img.width*yloc;
      // делаем так, чтобы не выходить за пределы изображения:
      loc = constrain(loc,0,img.pixels.length-1);
      // рассчитываем свертку:
      rtotal += (red(img.pixels[loc]) * matrix[i][j]);
      gtotal += (green(img.pixels[loc]) * matrix[i][j]);
      btotal += (blue(img.pixels[loc]) * matrix[i][j]);
    }
  }
  // ограничиваем диапазоны RGB-значений до 0-255:
  rtotal = constrain(rtotal, 0, 255);
  gtotal = constrain(gtotal, 0, 255);
  btotal = constrain(btotal, 0, 255);
  // возвращаем итоговый цвет:
  return color(rtotal, gtotal, btotal);
}

См.также

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