如何计算两幅图片相似 计算的相似度

我用JAVA做了个简易图像相似度计算器
关键算法:
&1 // 全流程
&2 public static void main(String[] args) throws IOException {
&3 & & // 获取图像
&4 & & File imageFile = new File(&c:/1.jpg&);
&5 & & Image image = ImageIO.read(imageFile);
&6 & & // 转换至灰度
&7 & & image = toGrayscale(image);
&8 & & // 缩小成32x32的缩略图
&9 & & image = scale(image);
10 & & // 获取灰度像素数组
11 & & int[] pixels = getPixels(image);
12 & & // 获取平均灰度颜色
13 & & int averageColor = getAverageOfPixelArray(pixels);
14 & & // 获取灰度像素的比较数组(即图像指纹序列)
15 & & pixels = getPixelDeviateWeightsArray(pixels, averageColor);
16 & & // 获取两个图的汉明距离(假设另一个图也已经按上面步骤得到灰度比较数组)
17 & & int hammingDistance = getHammingDistance(pixels, pixels);
18 & & // 通过汉明距离计算相似度,取值范围 [0.0, 1.0]
19 & & double similarity = calSimilarity(hammingDistance);
22 // 将任意Image类型图像转换为BufferedImage类型,方便后续操作
23 public static BufferedImage convertToBufferedFrom(Image srcImage) {
24 & & BufferedImage bufferedImage = new BufferedImage(srcImage.getWidth(null),
25 & & & & & & srcImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
26 & & Graphics2D g = bufferedImage.createGraphics();
27 & & g.drawImage(srcImage, null, null);
28 & & g.dispose();
29 & & return bufferedI
32 // 转换至灰度图
33 public static BufferedImage toGrayscale(Image image) {
34 & & BufferedImage sourceBuffered = convertToBufferedFrom(image);
35 & & ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
36 & & ColorConvertOp op = new ColorConvertOp(cs, null);
37 & & BufferedImage grayBuffered = op.filter(sourceBuffered, null);
38 & & return grayB
41 // 缩放至32x32像素缩略图
42 public static Image scale(Image image) {
43 & & image = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH);
47 // 获取像素数组
48 public static int[] getPixels(Image image) {
49 & & int width = image.getWidth(null);
50 & & int height = image.getHeight(null);
51 & & int[] pixels = convertToBufferedFrom(image).getRGB(0, 0, width, height,
52 & & & & & & null, 0, width);
56 // 获取灰度图的平均像素颜色值
57 public static int getAverageOfPixelArray(int[] pixels) {
59 & & long sumRed = 0;
60 & & for (int i = 0; i & pixels. i++) {
61 & & & & color = new Color(pixels[i], true);
62 & & & & sumRed += color.getRed();
64 & & int averageRed = (int) (sumRed / pixels.length);
65 & & return averageR
68 // 获取灰度图的像素比较数组(平均值的离差)
69 public static int[] getPixelDeviateWeightsArray(int[] pixels,final int averageColor) {
71 & & int[] dest = new int[pixels.length];
72 & & for (int i = 0; i & pixels. i++) {
73 & & & & color = new Color(pixels[i], true);
74 & & & & dest[i] = color.getRed() - averageColor & 0 ? 1 : 0;
79 // 获取两个缩略图的平均像素比较数组的汉明距离(距离越大差异越大)
80 public static int getHammingDistance(int[] a, int[] b) {
81 & & int sum = 0;
82 & & for (int i = 0; i & a. i++) {
83 & & & & sum += a[i] == b[i] ? 0 : 1;
88 // 通过汉明距离计算相似度
89 public static double calSimilarity(int hammingDistance){
90 & & int length = 32*32;
91 & & double similarity = (length - hammingDistance) / (double)
93 & & // 使用指数曲线调整相似度结果
94 & & similarity = java.lang.Math.pow(similarity, 2);13039人阅读
流媒体开发(11)
这个算法如果能实现, 有很多有用的地方。
&&&&&&& 我的想法是从摄像头采集到的视频, 取出其中的bmp图片, 保存一张静止的图片作为参照物, 这个时候假如有一个移动的物体从摄像头经过, 采集到的bmp图片肯定与参照物不一致,这个时候就会把这张图片保存下来, 所以我需要一个算法, 可以比较两张图片是否基本一致。
&&&&&& 在此列出该问题是希望大家各抒己见, 互相讨论一下这个算法的实现思路。
下面是有人提出的思路:
有个简单的方法就是随机取两幅图上的相同坐标的色素用Bitmap.GetPixel()方法。。你可以随机取10000次或者多少。然后对比每次取的像素是否相等。。两个变量来累计。。这样就可以粗略的计算出两个图片是否相似了。
循环 for& [i , j]
读出图片A 一点(像素)的 RGB 数值。
计算出灰度 YA[j][i] = 0.3*R + 0.59*G + 0.11*B
读出图片B 一点(像素)的 RGB 数值。
计算出灰度 YB[j][i] = 0.3*R + 0.59*G + 0.11*B
计算 一点 的 相似系数,
例如 灰度差除以两点平均灰度:
fabs(YA[j][i]-YB[j][i]) /& ((YA[j][i]+YB[j][i])/2.0)& -- 数值越小越相似
有了所有点的相似系数,做统计算,例如,把相似系数分20档,
计算落入各档的像素点的个数--就是概率啦。
画 概率分布图 和 累加 概率分布图。
当然,你可以设 累加 概率等于 几的地方 为 相似度 判据。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1909268次
积分:13658
积分:13658
排名:第786名
原创:118篇
转载:44篇
评论:650条
(4)(2)(1)(1)(7)(2)(1)(1)(2)(1)(4)(4)(9)(16)(14)(3)(2)(11)(2)(2)(1)(4)(7)(3)(6)(2)(2)(3)(5)(5)(8)(4)(3)(11)(1)(7)(1)(1)(2)啊 openCV纹理图像特征提取,DiffImg(图像比较工具) 。
您的举报已经提交成功,我们将尽快处理,谢谢!
是的,傻蛋!女孩子各人的情况都不同,有些一碰就有感觉,而有些要经过很常时间才会有动静的。
在图象→图象大小里改,
注意约束比例~
就是抠图、合成,Photoshop就可以做到,还有美图秀秀,这里有美图秀秀官网的教程/tutorial/82.sh...
两个人在一起的时候,无论是你和她,还是你们身边的人,都会感觉很舒服…
这样,算是合适!
答: 这个要根据自己当地的情况来看的每一个地方都会有一些家常菜就再没有必要太纠结这些事情。
大家还关注帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:外插是一种不精确的插值方式发信人: waicha (外插是一种不精确的插值方式), 信区: Graphics
标&&题: [合集] 请问关于两幅图片Hu不变矩的相似性度量问题,谢谢
发信站: 水木社区 (Tue Jul&&4 14:10:32 2006), 站内 && ☆─────────────────────────────────────☆ &&
newtrees (游泳的猫) 于
(Fri May 26 16:27:40 2006)
提到: && Hu的相似性度量问题
得到两幅图片的Hu不变矩
用什么方法度量相似度呢?谢谢了 && 下面是两幅图片的矩值,相差也太多了 && 一个是9位的,一个是12位的,要是用欧拉距离,前面几个矩的结果都被吞掉了啊 && h2 = && 1.0e+009 * &&&& 0.0000&&&&0.0000&&&&0.0001&&&&0.0001&&&&6.7599&&&&0.0001&& -9.7544
h1= &&&& 1.0e+012 * &&&& 0.0000&&&&0.0000&&&&0.0000&&&&0.0000&&&&1.1293&&&&0.0000&& -1.6644 &&&&&&&& ☆─────────────────────────────────────☆ &&
sunriswinter (dongdong ) 于
(Fri May 26 17:01:41 2006)
提到: && 先归一化,求出各个特征的均值和方差,然后归一化到0均值单位方差
或者线性归一化到(0,1)区间内
【 在 newtrees (游泳的猫) 的大作中提到: 】
: Hu的相似性度量问题
: 得到两幅图片的Hu不变矩
: 用什么方法度量相似度呢?谢谢了
: ...................
&&&&&&&&&& ☆─────────────────────────────────────☆ &&
newtrees (游泳的猫) 于
(Fri May 26 17:11:29 2006)
提到: && 万分感激啊!!!! && 我还有点问题,每个图片的7个hu不变矩构成的特征向量差别如此之大,有10的16次方倍啊 && 属于正常的值吗,我只是按照公式方法计算,不知道这个值是不是合理 && 请告知 && 在下面提到的"归一化到0均值单位方差",我真的没听说过,请详细给我讲讲,或者告诉我哪里能查到,真是麻烦了,谢谢 &&&& 【 在 sunriswinter (dongdong ) 的大作中提到: 】
: 先归一化,求出各个特征的均值和方差,然后归一化到0均值单位方差
: 或者线性归一化到(0,1)区间内
&&&&&&&& ☆─────────────────────────────────────☆ &&
sunriswinter (dongdong ) 于
(Fri May 26 22:01:27 2006)
提到: && 正常,只要公式没用错,还需要仔细检查检查
至于归一化,实际上是概率与数理统计中的概念
就是特征减均值然后除以标准差
【 在 newtrees (游泳的猫) 的大作中提到: 】
: 万分感激啊!!!!
: 我还有点问题,每个图片的7个hu不变矩构成的特征向量差别如此之大,有10的16次方倍啊
: 属于正常的值吗,我只是按照公式方法计算,不知道这个值是不是合理
: ...................
&&&&&&&&&& 文章数:1&分页:var sogou_ad_id=731545;
var sogou_ad_height=90;
var sogou_ad_width=980;}

我要回帖

更多关于 图片相似 计算 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信