业务:找出两个表的重复的图片。
图片在表里存的是二进制值,存在大量由于一些特殊情况例如扫描有差异,导致图片存的二进制值不同,但图片其实是一样来的。
所以找出两个表重复相同的图片,不可能只是单纯的比较二进制值相等。
方法:针对这种情况,使用OpenCV直方图算法可以比较两张图片的相似度,测试发现完全相同的图片相似度等于1(表里存的二进制值不相等)
实操:Java引入使用opencv步骤详解
1.引入opencv依赖
<!-- https://mvnrepository.com/artifact/org.openimaj/core -->
<dependency>
<groupId>org.openpnp</groupId>
<artifactId>opencv</artifactId>
<version>4.5.5-1</version>
</dependency>
2.代码Demo
opencv提供了均方差算法(MSE)、结构相似性指数算法(SSIM)、峰值信噪比算法(PSNR)、直方图算法(SSIM-WH),其中使用直方图算法来比较图片相似效果最好。
public static void main(String[] args) {
// 加载OpenCV库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 读取两张图像。准备比对的图片
Mat image1 = Imgcodecs.imread("D:\\work\\testdata\\psc_1716260008343.jpg");
Mat image2 = Imgcodecs.imread("D:\\work\\testdata\\psc_1716260008345.jpg");
// 将图片处理成一样大
Imgproc.resize(image1, image1, image2.size());
Imgproc.resize(image2, image2, image1.size());
// 计算均方差(MSE)
double mse = calculateMSE(image1, image2);
System.out.println("均方差(MSE): " + mse);
// 计算结构相似性指数(SSIM)
double ssim = calculateSSIM(image1, image2);
System.out.println("结构相似性指数(SSIM): " + ssim);
// 计算峰值信噪比(PSNR)
double psnr = calculatePSNR(image1, image2);
System.out.println("峰值信噪比(PSNR): " + psnr);
// 计算直方图
final double similarity = calculateHistogram(image1, image2);
System.out.println("图片相似度(直方图): " +