通过它们彼此的相似性来对一组给定图像进行排序的快速方法是什么.
目前我有一个系统在两个图像之间进行直方图分析,但这是一个非常昂贵的操作,似乎太过分了.
最理想的是,我正在寻找一种能够为每个图像提供分数的算法(例如整数分数,例如RGB平均值),我可以按该分数进行排序.相同的分数或分数彼此相邻可能是重复的.
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
Run Code Online (Sandbox Code Playgroud)
每张图像的RGB平均值很糟糕,有类似的东西吗?
我有一组图像文件,我想将它们的颜色数减少到64.我怎么能用OpenCV做到这一点?
我需要这个,所以我可以使用64大小的图像直方图.我正在实施CBIR技术
我想要的是4位调色板的颜色量化.
我想从图像中获得最常见的颜色.我使用Java,我希望拥有最主要的颜色.有没有任何cbir java库来做这个?
谢谢
计算两个图像之间的相似性有很多不同的算法,但是我找不到关于如何将这些信息存储在数据库中的任何信息,以便您可以快速找到类似的图像.
"类似"是指已经旋转(90度增量),颜色调整和/或重新保存(有损jpeg压缩)的精确重复.
我试图想出一个图像的" 指纹 ",以便我可以快速查找它们.
到目前为止,我提出的最好的方法是生成灰度直方图.使用16个箱和256个灰色阴影,我可以轻松创建一个16字节的指纹.这种方法运行得相当不错,但它并不像我想的那么强大.
我尝试的另一个解决方案是调整图像大小,旋转它们以使它们都以相同的方式定向,对它们进行灰度化,对直方图进行标准化,然后将它们缩小到大约8x8,并将颜色减少到16种灰度.尽管微缩图像非常相似,但它们通常偏离一两个像素,这意味着精确匹配不起作用.
如果没有精确匹配,我不相信有任何有效的方法来分组相似的照片(不将每张照片与其他每张照片进行比较,即O(n ^ 2)).
那么,(1)我如何创建我创建一个与上述要求不变的指纹/签名?或者,(2),如果这是不可能的,有什么其他的指标可以我用这样给定一个单一的形象,我可以找到它的最佳匹配数千数据库?
我有一堆从 pdf 中提取的质量较差的照片。我认识的某个人在她的电脑 (Mac) 上某处有高质量的照片,但我的理解是很难找到它们。
我想要
示例伪代码
for each image in poorQualityImages:
search ./macComputer for a higherQualityImage of image
copy higherQualityImage to ./higherQualityImages
Run Code Online (Sandbox Code Playgroud)
我需要执行一次此操作。我正在寻找一种工具、github 存储库或库,它可以执行此功能,而不是对基于内容的图像检索的深入理解。
imgdupes是一个程序,它似乎几乎实现了这一点,但我不想删除重复项,我想将最高质量的副本复制到目标文件夹
更新
给我以前的图像处理教授发了电子邮件,他给我发了这个
在我的头顶上,没有什么开箱即用的。
这里没有保证的解决方案,但您可以缩小搜索空间。您需要一个小程序来输出两个图像之间的 MSE 或 SSIM 相似度索引,然后编写另一个程序或 shell 脚本来扫描硬盘驱动器并计算硬盘驱动器上的每个图像与每个查询图像之间的 MSE,然后检查具有最高 X 百分比相似度得分的图像。
类似的东西。仍然不能保证找到你想要的一切。如果低质量图像与高质量图像的像素尺寸不同,则必须进行一些图像缩放才能获得相似度指数。如果质量差的图像具有不同的纵横比,那就更糟了。
所以我认为这并不难,但也不是微不足道的。难度部分取决于低质量图像中损坏的性质。
更新
我正在从文件夹"c1"访问10个图像,我有查询图像.我已经实现了在单元格数组中加载图像的代码,然后我将逐个计算查询图像与文件夹"c1"中每个图像之间的直方图交集.现在我想绘制精确回忆曲线,但我不知道如何编写代码以使用从直方图交叉点获得的数据获得"精确回忆曲线".我的代码:
Inp1=rgb2gray(imread('D:\visionImages\c1\1.ppm'));
figure, imshow(Inp1), title('Input image 1');
srcFiles = dir('D:\visionImages\c1\*.ppm'); % the folder in which images exists
for i = 1 : length(srcFiles)
filename = strcat('D:\visionImages\c1\',srcFiles(i).name);
I = imread(filename);
I=rgb2gray(I);
Seq{i}=I;
end
for i = 1 : length(srcFiles) % loop for calculating histogram intersections
A=Seq{i};
B=Inp1;
a = size(A,2); b = size(B,2);
K = zeros(a, b);
for j = 1:a
Va = repmat(A(:,j),1,b);
K(j,:) = 0.5*sum(Va + B - abs(Va - B));
end
end
Run Code Online (Sandbox Code Playgroud) 我正在开发一种集成在车牌识别应用程序中的CBIR解决方案.图像匹配算法非常强大,但是您可以想象数据库非常庞大,从数据库中提取图像以进行匹配的速度非常慢.我试图用像小的局部特征向量或甚至单个数值来量化图像,但没有成功.这个想法是索引一些这样的值,以允许真正快速的提取,同时大大减少匹配候选的数量.我已经阅读了很多关于这个主题的论文,但是大多数论文都将分类和机器学习作为一种解决方案.由于我没有看到分类如何有用,因为所有图像彼此非常相似(车牌图片),我想与过去遇到过类似问题的人讨论想法,或者甚至是某些人关于如何解决这个问题的线索.我一直在努力设法解决这个性能问题很长一段时间,但没有多少成功.
我需要搜索一个巨大的图像数据库以使用 pHash 查找可能的重复项,假设这些图像记录具有使用 pHash 生成的哈希码。
现在我必须比较一个新图像,我必须使用 pHash 针对现有记录为此创建哈希。但根据我的理解,有比较并不像
hash1 - has2 < threshold
Run Code Online (Sandbox Code Playgroud)
看起来我需要将两个哈希码传递到 pHash API 中进行匹配。所以我必须从数据库中批量检索所有哈希码并使用 pHash API 一一比较。
但是如果我有大约 1000 张图像在队列中与数百万已经存在的图像进行比较,这看起来不是最好的方法。
我需要知道以下内容。
提前致谢。
我的理解:SIFT描述符使用从16x16邻域像素计算的方向梯度的直方图.大图像中的16x16区域可以是非常小的区域,例如猫爪上的一根头发的1/10,当您将目标图像调整为小尺寸时,围绕相同关键点的16x16邻域可以是大部分的图像,例如猫的爪子使用SIFT描述符将原始图像与调整大小的图像进行比较是没有意义的,任何人都可以告诉我我的理解有什么问题吗?
我听说Matlab的图像处理库与Java的图像处理库相比很慢.
真的吗 ??
如果是这样,那么使用Matlab 实现像CBIR图像搜索引擎这样的应用程序是否可行?
到目前为止,我已经能够在CBIR系统中绘制灰度图像的Precision-Recall图.但是,我想知道如何对RGB图像执行相同的处理.
我的代码:
Inp1=rgb2gray(imread('D:\visionImages\c1\1.ppm'));
figure, imshow(Inp1), title('Input image 1');
num_bins = 32;
A = imhist(Inp1, num_bins);
srcFiles = dir('D:\visionImages\c1\*.ppm');
B = zeros(num_bins, 30);
ptr=1;
for i = 1 : length(srcFiles)
filename = strcat('D:\visionImages\c1\',srcFiles(i).name);
I = imread(filename);
I=rgb2gray(I);
B(:,ptr) = imhist(I, num_bins);
ptr=ptr+1;
end
% histogram intersection
a = size(A,2); b = size(B,2);
K = zeros(a, b);
for i = 1:a
Va = repmat(A(:,i),1,b);
K(i,:) = 0.5*sum(Va + B - abs(Va - B));
end
num_images = 30;
sims=K
relevant_IDs = [1 2 …Run Code Online (Sandbox Code Playgroud)