在processing.org中进行简单图像识别

时间:2017-01-11 00:57:19

标签: image-processing processing image-recognition

我正在尝试编写最简单的图像比较功能。 想法是具有目标图像和n个不同图像的集合。

目标是选择与目标图像最相似的图像。

到目前为止,我的方法包括在调整大小的图像中定义从像素到像素的欧几里德HSB距离,并且一直在尝试执行返回获胜者图像的-H Accept:text/html函数。我已经编写了一个PImage函数,可以将图像列表从赢家到输家排序,但我想跳过这一步,使流程更加简洁。

问题发生在float 函数,程序在行上输出错误:

PImage difference(PImage){

错误是ArrayIndexOutOfBoundsException

以下是整个代码:

        float x1 = brightness(imageKey.pixels[i]);

1 个答案:

答案 0 :(得分:0)

孤立地,你的功能似乎有效:

PImage imageKey,testImage;
int imageWidth = 800;
int imageHeight = 600;

void setup(){
  size(1600,600);
  //fake imageKey
  imageKey = getNoise(imageWidth,imageHeight);

  //fake test image
  testImage = getNoise(imageWidth,imageHeight);

  image(testImage,0,0);
  image(difference(testImage),800,0);
}

PImage getNoise(int width,int height){
  PImage out = createImage(width,height,RGB);

  for(int i = 0 ; i < out.pixels.length; i++) 
    out.pixels[i] = color(random(255),random(255),random(255));

  out.updatePixels();

  return out;
}

PImage difference(PImage satin)
{
  colorMode(HSB);

  satin.loadPixels();
  imageKey.loadPixels();

  PImage satout = createImage(satin.width, satin.height, RGB);

  satout.loadPixels();
  for (int i = imageWidth; i<satout.pixels.length-imageWidth; i++)
  {
    float x1 = brightness(imageKey.pixels[i]);
    float b0 = brightness(satin.pixels[i]);
    // float y1 = brightness(satin.pixels[i+1]);

    float value = x1-b0;
    //println(i,x1,b0,x1-b0,value);

    satout.pixels[i] = color(0, 0, value);
  }
  satout.updatePixels();

  return satout;
}

我无法测试您的实际设置,因为我无法访问您的图片,但ArrayIndexOutOfBoundsException可能是因为您的i计数器超出{{1}中的像素数}。您可以通过检查是否imageKey来测试这一点。我的猜测是图像的尺寸不同,因此不会有相同的像素数。

略微偏离主题的其他说明:

  1. 您的i < imageKey.pixels.length函数与difference()imageKey变量紧密相关。您可能希望将函数松散耦合,以便在其他上下文中轻松重用它们。您可以从使这两个变量的函数
  2. 的额外参数/参数开始
  3. 您可能还想查看颜色之间的欧氏距离(在感知颜色空间中,例如L a b *)。看看this answer。即使它是OpenFrameworks的答案,也应该很容易适应处理的imageWidthcolor类型。