2

我想在处理中构建一种图像变形工具。类似于您在此链接中看到的内容:

https://giphy.com/gifs/painting-morph-oil-c8ygOpL64UDuw

我实现这一目标的第一步是构建一个二维像素网格。像素充满颜色。填充颜​​色是通过使用 get(); 从图像 (PImage img1;) 中读取颜色来创建的;功能。这就是我用像素重新创建图像的方式。在第二步中,我想我会使用 lerp(); 函数为各个像素提供第二张图像的颜色 (PImage img2;) - 我认为这会产生所需的变形效果。但是我错了!整个事情都有效 - 但效果只是在两个图像之间发生淡入。并且没有变形。在这种变形效果下,像素究竟会发生什么?我怎样才能在处理中重新创建它?

float pixel;
float pixelsize;
PImage img1;
PImage img2;
float counter;

void setup() {
  size(1080, 1080);
  pixel = 100;
  pixelsize = width/pixel;
  noStroke();
  img1 = loadImage("0.jpg");
  img2 = loadImage("1.jpg");
  counter = 0;
}


void draw() {
  background(255);

  for (int y = 0; y < pixel; y++) {
    for (int x = 0; x < pixel; x++) {
      color c1 = img1.get(int(pixelsize*x), int(pixelsize*y));
      color c2 = img2.get(int(pixelsize*x), int(pixelsize*y));

      color from = c1;
      color to = c2;
      color interA = lerpColor(from, to, counter);

      pushMatrix();
      translate(pixelsize*x, pixelsize*y);
      fill(interA);
      rect(0, 0, pixelsize, pixelsize);
      popMatrix();
    }
  }
  counter= counter + 0.01;
}
4

1 回答 1

3

事实上,这不是一项直接的任务。

你的方法不是一个糟糕的开始:它会导致两个图像之间的交叉淡入淡出。

考虑get()到 CPU 成本可能很高。但是,您可以使用pixels[]

PImage img1;
PImage img2;
// transition image
PImage imgT;

void setup() {
  size(1080, 1080);
  
  img1 = loadImage("0.jpg");
  img2 = loadImage("1.jpg");
  // copy the 1st image (copies width/height as well)
  imgT = img1.get();
}


void draw() {
  background(255);
  // map transition amount to mouse X position
  float t = map(mouseX, 0, width, 0.0, 1.0);
  
  // make all pixels readable
  imgT.loadPixels();
  // lerp each pixel
  for(int i = 0 ; i < imgT.pixels.length; i++){
    imgT.pixels[i] = lerpColor(img1.pixels[i], img2.pixels[i], t);
  }
  // update all pixels in one go
  imgT.updatePixels();
  
  // display result
  image(imgT, 0, 0);
}

实现完整的变形图像并非易事。我可以推荐两个选项来利用现有算法,但是这些选项也不适合初学者:

  1. ImageMagick 实现了 shepards 失真,并且有一个与 imagemagick 接口的 java 库:im4java。请注意,您需要下载预编译的 java 库并将 .jar 文件放在草图上,处理输出可能需要一些时间:对于实时可能不可行(但是应该可以将单个帧保存到磁盘并组装它们作为 gif/电影/等)
  2. 使用 OpenCV:有一个OpenCV Face Morph教程,其中包含 c++ 或Python源代码,还有一个处理 OpenCV 库。这将是将 c++/Python OpenCV 调用移植到 Java OpenCV API 的问题。
于 2022-02-21T21:19:09.420 回答