Processing:Примеры/Свертка
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Среда разработки Processing | Справочник языка Processing | Библиотеки | Примеры | Режимы программирования |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Описание[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);
}
См.также
Внешние ссылки
Примеры на Processing | |
---|---|
Основы |
|
Продвинутые графические эффекты |
|
Примеры из сторонних библиотек |