当前位置:   article > 正文

Android opencv 差值哈希算法,均值哈希算法,图片差异相似度识别_android开发 opencv 梯度幅度相似性偏差

android开发 opencv 梯度幅度相似性偏差

android上使用OpenCV,首先是要导入相应的sdk模块,这个网上都有很多了,不再多说了,要注意的一点是,Android opencv 的sdk要是3.4.7的,sdk模块的名称是openCVLibrary347。

在android上使用opencv的时候,打包成的apk会比较大,大概有80M。

接下来上代码

  1. package com.example.agrdf.picturecompare;
  2. import org.opencv.core.CvType;
  3. import org.opencv.core.Mat;
  4. import org.opencv.core.Size;
  5. import org.opencv.imgcodecs.Imgcodecs;
  6. import org.opencv.imgproc.Imgproc;
  7. /**
  8. * Created by agrdf on 2022/12/9.
  9. */
  10. public class example {
  11. // 判断差异值,小于差异值,判断为相同图片,返回true,否则返回false
  12. public boolean path_to_judge2(String path1,String path2,double auui,double auui2){
  13. Mat img1=cv_read(path1);
  14. Mat img2=cv_read(path2);
  15. // 判断差异值的
  16. return method_2(img1,img2,auui,auui2);
  17. }
  18. // 从图片绝对路径得到Mat
  19. public Mat cv_read(String res){
  20. Mat img = Imgcodecs.imread(res, Imgcodecs.IMREAD_UNCHANGED);
  21. return img;
  22. }
  23. // 对图片的Mat进行缩放
  24. private void resize_to_eight_eight(Mat srcMat){
  25. // 缩放成8*8大小,比较ahash均值哈希值
  26. Imgproc.resize(srcMat, srcMat,new Size(8,8) , 0, 0, Imgproc.INTER_CUBIC);
  27. }
  28. // 缩放成8*9大小,比较dhash差值哈希算法的值
  29. private void resize_to_nine_eight(Mat srcMat){
  30. Imgproc.resize(srcMat, srcMat,new Size(9,8) , 0, 0, Imgproc.INTER_CUBIC);
  31. }
  32. // 就Mat转换为灰度图
  33. private Mat mat_to_gray(Mat resaa){
  34. Size dsize = new Size(resaa.width() , resaa.height() );
  35. Mat img2 = new Mat(dsize, CvType.CV_16U);
  36. Imgproc.cvtColor(resaa,img2,Imgproc.COLOR_BGR2GRAY);
  37. return img2;
  38. }
  39. // 算出一个mat的均值哈希值ahash
  40. private double[] get_one_averg_gray(Mat dst1){
  41. double[][] data1 = new double[64][1];
  42. //iAvg 平均像素灰度值,arr像素灰度值,
  43. int iAvg1 = 0;
  44. double[] arr1 = new double[64];
  45. //get灰度给data,用data给arr充值,算平均灰度值iAvg。
  46. for (int i = 0; i < 8; i++)
  47. {
  48. int tmp = i * 8;
  49. for (int j = 0; j < 8; j++)
  50. {
  51. int tmp1 = tmp + j;
  52. // data得到1个点位的像素
  53. data1[tmp1] = dst1.get(i,j);
  54. // 然后赋值到arr上储存起来
  55. arr1[tmp1] = data1[tmp1][0];
  56. // 每个像素点相加,得到总灰度
  57. iAvg1 += arr1[tmp1];
  58. }
  59. }
  60. // 总灰度变成平均灰度
  61. iAvg1 /= 64;
  62. //比对每个像素灰度值和平均灰度值大小,大于平均灰度的,就+1
  63. for (int i = 0; i < 64; i++)
  64. {
  65. arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
  66. }
  67. return arr1;
  68. }
  69. // 比较两个ahash,得到差异数量,1为差异最大
  70. private double dif_ahsah(double[] arr1,double[] arr2 ){
  71. int iDiffNum = 0;
  72. for (int i = 0; i < 64; i++){
  73. if (arr1[i] != arr2[i]){
  74. ++iDiffNum;
  75. }
  76. }
  77. return ((double)iDiffNum)/64.0;
  78. }
  79. // 得到一个差值哈希值
  80. private String dhash(Mat src){
  81. double average = 0;
  82. String hash = "";
  83. int[] arr = new int[64];
  84. for (int i = 0; i < 8; i++) {
  85. int count = i*8;
  86. for (int j = 0; j < 8; j++) {
  87. double[] data = src.get(i, j);
  88. double[] data2 = src.get(i, j+1);
  89. if ((int) data[0] > (int) data2[0]){
  90. hash += "0";
  91. }else {
  92. hash += "1";
  93. }
  94. }
  95. }
  96. return hash;
  97. }
  98. // 比较两个差值哈希,得到差异值
  99. private double dif_dhsah(String str1,String str2){
  100. int num = 0;
  101. for (int i = 0; i < 64; i++) {
  102. if (str1.charAt(i) != str2.charAt(i)){
  103. num++;
  104. }
  105. }
  106. return ((double)num)/64.0;
  107. }
  108. // double ook1, double ook2分别是均值哈希和差值哈希算法的对比值
  109. // 是差异的数量,越大,代表差异越大,是不同的图片,最大差异值为1,为完全不相同的图片
  110. // 区别不同图片,一般设置为0.5.差异数量超过0.5,就可以认为是不同的图片。因为可能会有一些其他色素的误差。
  111. private boolean method_2(Mat source1, Mat source2, double ook1, double ook2){
  112. // 这是比较ahash的
  113. resize_to_eight_eight(source1);
  114. Mat gra1=mat_to_gray(source1);
  115. double[] ahash1=get_one_averg_gray(gra1);
  116. resize_to_eight_eight(source2);
  117. Mat gra2=mat_to_gray(source2);
  118. double[] ahash2=get_one_averg_gray(gra2);
  119. double judge_ahash=dif_ahsah(ahash1,ahash2);
  120. // 接下来是比较dhash的
  121. resize_to_nine_eight(source1);
  122. Mat dhash_gra1=mat_to_gray(source1);
  123. String dhash1=dhash(dhash_gra1);
  124. resize_to_nine_eight(source2);
  125. Mat dhash_gra2=mat_to_gray(source2);
  126. String dhash2=dhash(dhash_gra2);
  127. double judge_dhash=dif_dhsah(dhash1,dhash2);
  128. if((judge_ahash<ook1)&&(judge_dhash<ook2)){
  129. return true;
  130. }else {
  131. return false;
  132. }
  133. }
  134. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/961654?site
推荐阅读
相关标签
  

闽ICP备14008679号