自己琢磨的 图像相似度算法 JAVA版实现

     最近有个项目里要整理缩略图和原图是否匹配,然后就去找工具和方法做了,之后很好奇图像相似度是怎么算的,google了下貌似很深奥,而且无最简单的例子java代码源码下载,估计图形学的人不削用java吧。      

     个人从来没有研究过图像学,也没看过什么论文或者相关文档,写这个完全是靠google和百度,自己写了个实验了下,测试用例也少,估计有大BUG的存在,所以看的人权当学习交流,切勿生产使用。


     思路:

      1,二值化,(不做颜色比对了,生成黑白图)

      2 ,取黑色的矩形阵列,(不管图片大小,只取同颜色的矩形区域,判断规则下文讲)

      3,排序取前几个矩阵,(去最大矩阵的 %d 面积以上的矩阵,%d作为参数)。

      4,取得2张图的矩阵,对比矩阵距离面积等,根据面积权重,得到相似度。

  


如这么图取的矩阵就是红色区域,没画全。


   

好了,开始了,下面的代码要是有人发现问题PM我,我去改正:

     1,二值化:

package cn.my.image.Compare.test;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

public class Binarization {
	private static float RP = 0.333f;
	private static float GP = 0.334f;
	private static float BP = 0.333f;
	private static int Threshold = 0;
	private int h;
	private int w;
	public Binarization(){
		
	}
	/**
	 * set your threshold such as 160  这里手工设判断黑白的标准,默认是图像全局的平均值。
	 * @param threshold
	 */
	public Binarization(int threshold){
		Threshold = threshold;
	}
	/**
	 * init with r,g,b Proportion  设置R G B的权重比,默认平分
	 * @param r
	 * @param g
	 * @param b
	 */
	public Binarization(float r,float g,float b,int threshold){
		RP = r;
		GP = g;
		BP = b;
		Threshold = threshold;
	}
	public int getH(){
		return h;
	}
	public int getW() {
		return w;
	}
	public int getArea(){
		return w*h;
	}
	
	public int[][] toBinarization(InputStream stream) throws IOException {
		BufferedImage bi=ImageIO.read(stream);//input image
		h=bi.getHeight();//get height
		w=bi.getWidth();//get width
		int sumRGB = 0;
		int[][] gray=new int[w][h];
		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				gray[x][y]=getGray(bi.getRGB(x, y));
				sumRGB = sumRGB + gray[x][y];
			}
		}
		if(Threshold ==0){
			Threshold = sumRGB/(h*w); //threshold by avager
		}
		int[][] binary=new int[w][h];
		
		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				if(getAverageColor(gray, x, y, w, h)>Threshold){
					binary[x][y] = 1 ;    /// 1 for White
				}else{
					b
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
余弦相似算法是一种常用的衡量两个向量之间相似度的方法,它可以用于文本相似度计算、推荐系统等领域。在Java中,可以通过以下步骤来实现余弦相似算法: 1. 首先,需要将文本转换为向量表示。可以使用词袋模型或者TF-IDF等方法将文本转换为向量。 2. 计算两个向量的内积。内积可以通过遍历两个向量的对应维度,将对应维度的值相乘后累加得到。 3. 计算两个向量的模长。模长可以通过遍历向量的每个维度,将对应维度的值平方后累加得到,再对结果进行开方。 4. 计算余弦相似度。将步骤2中计算得到的内积除以步骤3中计算得到的模长乘积即可得到余弦相似度。 下面是一个简单的Java代码示例: ```java import java.util.HashMap; import java.util.Map; public class CosineSimilarity { public static double calculateCosineSimilarity(Map<String, Integer> vector1, Map<String, Integer> vector2) { double dotProduct = 0.0; double magnitude1 = 0.0; double magnitude2 = 0.0; for (String key : vector1.keySet()) { if (vector2.containsKey(key)) { dotProduct += vector1.get(key) * vector2.get(key); } magnitude1 += Math.pow(vector1.get(key), 2); } for (String key : vector2.keySet()) { magnitude2 += Math.pow(vector2.get(key), 2); } magnitude1 = Math.sqrt(magnitude1); magnitude2 = Math.sqrt(magnitude2); return dotProduct / (magnitude1 * magnitude2); } public static void main(String[] args) { // 示例向量 Map<String, Integer> vector1 = new HashMap<>(); vector1.put("apple", 2); vector1.put("banana", 3); vector1.put("orange", 1); Map<String, Integer> vector2 = new HashMap<>(); vector2.put("apple", 1); vector2.put("banana", 2); vector2.put("grape", 4); double similarity = calculateCosineSimilarity(vector1, vector2); System.out.println("余弦相似度:" + similarity); } } ``` 这段代码中,我们定义了一个`calculateCosineSimilarity`方法来计算余弦相似度。通过传入两个向量的词频统计结果,即`Map<String, Integer>`类型的`vector1`和`vector2`,可以得到它们之间的余弦相似度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值