我正在寻找创建一个图像基表,然后比较任何新图像,以确定新图像是否是基本的精确(或接近)副本.
例如:如果您想减少100次相同图像的存储空间,您可以存储它的一个副本并提供它的参考链接.输入新图像时,您想要与现有图像进行比较,以确保它不是重复的...想法?
我的一个想法是缩小到一个小缩略图,然后随机选择100个像素位置并进行比较.
在StackOverflow上已存在类似此链接的问题,并且接受的答案是"强制转换":
Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我尝试:
final float FACTOR = 4f;
BufferedImage img = ImageIO.read(new File("graphic.png"));
int scaleX = (int) (img.getWidth() * FACTOR);
int scaleY = (int) (img.getHeight() * FACTOR);
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);
BufferedImage buffered = (BufferedImage) image;
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了运行时错误:
sun.awt.image.ToolkitImage无法强制转换为java.awt.image.BufferedImage
显然铸造不起作用.
问题是:将Image转换为BufferedImage的正确方法是什么(或有没有)?
我花了很多时间研究一个允许我用Java比较图像的库.
我真的没有找到任何有用的东西,也许我的GoogleSearch技能不够高,所以我想我会问你们,如果你能指出我可以找到类似这样的方向.
基本上我想要做的是将两个图像相互比较,得到两个相似的值.像一个百分比左右.
我希望你们有一些我可以使用的东西,我不知道怎么写自己这样的东西......
PS:它不一定是Java,只是我的应用程序将运行的环境.
计算两个图像之间的相似性有很多不同的算法,但是我找不到关于如何将这些信息存储在数据库中的任何信息,以便您可以快速找到类似的图像.
"类似"是指已经旋转(90度增量),颜色调整和/或重新保存(有损jpeg压缩)的精确重复.
我试图想出一个图像的" 指纹 ",以便我可以快速查找它们.
到目前为止,我提出的最好的方法是生成灰度直方图.使用16个箱和256个灰色阴影,我可以轻松创建一个16字节的指纹.这种方法运行得相当不错,但它并不像我想的那么强大.
我尝试的另一个解决方案是调整图像大小,旋转它们以使它们都以相同的方式定向,对它们进行灰度化,对直方图进行标准化,然后将它们缩小到大约8x8,并将颜色减少到16种灰度.尽管微缩图像非常相似,但它们通常偏离一两个像素,这意味着精确匹配不起作用.
如果没有精确匹配,我不相信有任何有效的方法来分组相似的照片(不将每张照片与其他每张照片进行比较,即O(n ^ 2)).
那么,(1)我如何创建我创建一个与上述要求不变的指纹/签名?或者,(2),如果这是不可能的,有什么其他的指标可以我用这样给定一个单一的形象,我可以找到它的最佳匹配数千数据库?
我正在尝试制作一个程序,可以从图像数据集中找到类似的图像.步骤是
现在每个图像SURF描述符将被存储为分层k-means树,现在我将每个树存储为单独的文件,或者是否可以构建某种具有所有图像描述符的单个树并在将图像添加到数据集时更新.
algorithm image-processing computer-vision feature-detection