Android opencv 差值哈希算法,均值哈希算法,图片差异相似度识别
android上使用OpenCV,首先是要导入相应的sdk模块,这个网上都有很多了,不再多说了,要注意的一点是,Android opencv 的sdk要是3.4.7的,sdk模块的名称是openCVLibrary347。
在android上使用opencv的时候,打包成的apk会比较大,大概有80M。
接下来上代码
-
package com.example.agrdf.picturecompare;
-
-
import org.opencv.core.CvType;
-
import org.opencv.core.Mat;
-
import org.opencv.core.Size;
-
import org.opencv.imgcodecs.Imgcodecs;
-
import org.opencv.imgproc.Imgproc;
-
-
/**
-
* Created by agrdf on 2022/12/9.
-
*/
-
-
public class example {
-
-
// 判断差异值,小于差异值,判断为相同图片,返回true,否则返回false
-
public boolean path_to_judge2(String path1,String path2,double auui,double auui2){
-
Mat img1=cv_read(path1);
-
Mat img2=cv_read(path2);
-
// 判断差异值的
-
return method_2(img1,img2,auui,auui2);
-
}
-
-
// 从图片绝对路径得到Mat
-
public Mat cv_read(String res){
-
Mat img = Imgcodecs.imread(res, Imgcodecs.IMREAD_UNCHANGED);
-
return img;
-
}
-
-
// 对图片的Mat进行缩放
-
private void resize_to_eight_eight(Mat srcMat){
-
// 缩放成8*8大小,比较ahash均值哈希值
-
Imgproc.resize(srcMat, srcMat,new Size(8,8) , 0, 0, Imgproc.INTER_CUBIC);
-
}
-
// 缩放成8*9大小,比较dhash差值哈希算法的值
-
private void resize_to_nine_eight(Mat srcMat){
-
Imgproc.resize(srcMat, srcMat,new Size(9,8) , 0, 0, Imgproc.INTER_CUBIC);
-
}
-
-
// 就Mat转换为灰度图
-
private Mat mat_to_gray(Mat resaa){
-
Size dsize = new Size(resaa.width() , resaa.height() );
-
Mat img2 = new Mat(dsize, CvType.CV_16U);
-
Imgproc.cvtColor(resaa,img2,Imgproc.COLOR_BGR2GRAY);
-
return img2;
-
}
-
-
// 算出一个mat的均值哈希值ahash
-
private double[] get_one_averg_gray(Mat dst1){
-
double[][] data1 = new double[64][1];
-
-
//iAvg 平均像素灰度值,arr像素灰度值,
-
int iAvg1 = 0;
-
double[] arr1 = new double[64];
-
-
//get灰度给data,用data给arr充值,算平均灰度值iAvg。
-
for (int i = 0; i < 8; i )
-
{
-
int tmp = i * 8;
-
for (int j = 0; j < 8; j )
-
{
-
int tmp1 = tmp j;
-
// data得到1个点位的像素
-
data1[tmp1] = dst1.get(i,j);
-
// 然后赋值到arr上储存起来
-
arr1[tmp1] = data1[tmp1][0];
-
// 每个像素点相加,得到总灰度
-
iAvg1 = arr1[tmp1];
-
-
}
-
}
-
-
// 总灰度变成平均灰度
-
iAvg1 /= 64;
-
//比对每个像素灰度值和平均灰度值大小,大于平均灰度的,就 1
-
for (int i = 0; i < 64; i )
-
{
-
arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
-
}
-
return arr1;
-
}
-
-
-
// 比较两个ahash,得到差异数量,1为差异最大
-
private double dif_ahsah(double[] arr1,double[] arr2 ){
-
int iDiffNum = 0;
-
for (int i = 0; i < 64; i ){
-
if (arr1[i] != arr2[i]){
-
iDiffNum;
-
}
-
-
}
-
return ((double)iDiffNum)/64.0;
-
}
-
-
-
// 得到一个差值哈希值
-
private String dhash(Mat src){
-
-
double average = 0;
-
String hash = "";
-
int[] arr = new int[64];
-
for (int i = 0; i < 8; i ) {
-
int count = i*8;
-
for (int j = 0; j < 8; j ) {
-
double[] data = src.get(i, j);
-
double[] data2 = src.get(i, j 1);
-
-
if ((int) data[0] > (int) data2[0]){
-
-
hash = "0";
-
}else {
-
hash = "1";
-
}
-
-
}
-
}
-
-
return hash;
-
-
}
-
-
// 比较两个差值哈希,得到差异值
-
private double dif_dhsah(String str1,String str2){
-
int num = 0;
-
for (int i = 0; i < 64; i ) {
-
if (str1.charAt(i) != str2.charAt(i)){
-
num ;
-
}
-
}
-
return ((double)num)/64.0;
-
}
-
-
// double ook1, double ook2分别是均值哈希和差值哈希算法的对比值
-
// 是差异的数量,越大,代表差异越大,是不同的图片,最大差异值为1,为完全不相同的图片
-
// 区别不同图片,一般设置为0.5.差异数量超过0.5,就可以认为是不同的图片。因为可能会有一些其他色素的误差。
-
private boolean method_2(Mat source1, Mat source2, double ook1, double ook2){
-
-
// 这是比较ahash的
-
resize_to_eight_eight(source1);
-
Mat gra1=mat_to_gray(source1);
-
double[] ahash1=get_one_averg_gray(gra1);
-
-
resize_to_eight_eight(source2);
-
Mat gra2=mat_to_gray(source2);
-
double[] ahash2=get_one_averg_gray(gra2);
-
-
double judge_ahash=dif_ahsah(ahash1,ahash2);
-
-
// 接下来是比较dhash的
-
-
resize_to_nine_eight(source1);
-
Mat dhash_gra1=mat_to_gray(source1);
-
String dhash1=dhash(dhash_gra1);
-
-
resize_to_nine_eight(source2);
-
Mat dhash_gra2=mat_to_gray(source2);
-
String dhash2=dhash(dhash_gra2);
-
-
double judge_dhash=dif_dhsah(dhash1,dhash2);
-
-
if((judge_ahash<ook1)&&(judge_dhash<ook2)){
-
-
return true;
-
}else {
-
-
return false;
-
-
}
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfigkbe
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24