如何检查2个图像是否与参考对象相似?

时间:2018-06-05 06:31:29

标签: java android android-layout

在我的应用程序中,我想检查拍摄的图像是否具有与前一图像相同的参考对象。 例如。我拍摄了一张除了开阔的土地之外还有一根柱子的图像,并说几个月后我抓住了站在同一位置的图像,现在我得到了一个杆子和一些建筑物的图像。我想检查图像在这方面是否相似。

2 个答案:

答案 0 :(得分:0)

我们无法检查对象,但其他方式是我们可以将图像保存到drawable然后我们可以检查图像的字节,如果字节相同则图像相同

尝试与字节或像素进行比较是唯一可行的方法。

drawable1.bytesEqualTo(drawable2) 
drawable1.pixelsEqualTo(drawable2) 
bitmap1.bytesEqualTo(bitmap1) 
bitmap1.pixelsEqualTo(bitmap2) 

答案 1 :(得分:0)

选项A :计算简化的直方图(8位)。按直方图相似度对图像进行排序。

我在图像处理类中使用过它。这是比较图像的一种非常宽容的方式。照明或方向的微小变化不会打破比较。您甚至可以将图像翻转90°或180°。

我仍然有代码,即使它是matlab,它可能会有所帮助:

// image to compare:
QueryPicture = imread(strcat('E:\Users\user98\Images\',num2str(floor(result/10)),num2str(mod(result,10)),'.jpg'));

sums = zeros(50,2);

 h = zeros(64,50);

 // do a simpified histogram:
 for n=1:50
    img=double(imread(strcat('E:\Users\user98\Images\',num2str(floor(n/10)),num2str(mod(n,10)),'.jpg')));
    for i=1:200
         for j=1:200         
             x1 = bitshift(img(i,j,1), -6);
             x2 = bitshift(img(i,j,2), -6) * 4;
             x3 = bitshift(img(i,j,3), -6) * 16;
             x = x1 + x2 + x3;
             h(x+1, n) = (h(x+1, n) + 1);
         end
    end
 end

// compare histograms:
for n=1:50
    tmpVec = zeros(64,1);
    for i=1:64
        tmpVec(i) = abs(h(i,n) - h(i,result));
    end

    for j=1:64 
       sums(n,1) = sums(n,1)+tmpVec(j);
    end
    sums(n,2) = n;
end
sortedImages = sortrows(sums,1)



// Show compare-image:
subplot(2,3,1); image(uint8(QueryPicture));
// show 3 best matches for compare-image:
sortedImages(1);
sortedImages(2);
sortedImages(3);
img1=double(imread(strcat('E:\Users\user98\Images\',num2str(floor(sortedImages(2,2)/10)),num2str(mod(sortedImages(2,2),10)),'.jpg')));
img2=double(imread(strcat('E:\Users\user98\Images\',num2str(floor(sortedImages(3,2)/10)),num2str(mod(sortedImages(3,2),10)),'.jpg')));
img3=double(imread(strcat('E:\Users\user98\Images\',num2str(floor(sortedImages(4,2)/10)),num2str(mod(sortedImages(4,2),10)),'.jpg')));

subplot(2,3,4); image(uint8(img1));
subplot(2,3,5); image(uint8(img2));
subplot(2,3,6); image(uint8(img3));

选项B:

如果可用,请使用图像中的gps数据(exif)。

选项C:

Google Lens是一款可以对图像进行分类和检测对象的应用。