我正在尝试编写最简单的图像比较功能。 想法是具有目标图像和n个不同图像的集合。
目标是选择与目标图像最相似的图像。
到目前为止,我的方法包括在调整大小的图像中定义从像素到像素的欧几里德HSB距离,并且一直在尝试执行返回获胜者图像的-H Accept:text/html
函数。我已经编写了一个PImage
函数,可以将图像列表从赢家到输家排序,但我想跳过这一步,使流程更加简洁。
问题发生在float
函数,程序在行上输出错误:
PImage difference(PImage){
错误是ArrayIndexOutOfBoundsException
以下是整个代码:
float x1 = brightness(imageKey.pixels[i]);
答案 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
来测试这一点。我的猜测是图像的尺寸不同,因此不会有相同的像素数。
略微偏离主题的其他说明:
i < imageKey.pixels.length
函数与difference()
和imageKey
变量紧密相关。您可能希望将函数松散耦合,以便在其他上下文中轻松重用它们。您可以从使这两个变量的函数imageWidth
和color
类型。