图像相似度算法的C#实现及测评
近日逛博客的时候偶然发现了一个有关图片相似度的Python算法实现。想着很有意思便搬到C#上来了,给大家看看。
闲言碎语
才疏学浅,只把计算图像相似度的一个基本算法的基本实现方式给罗列了出来,以至于在最后自己测评的时候也大发感慨,这个算法有点不靠谱。不管怎么样,这个算法有时候还是有用的,所以还是列出来跟大家伙一起分享分享~~
PS:图像处理这一块博大精深,个人偶尔发现了点东西拿来分享。说的不好的地方,写得太糟的地方,诸位准备扔砖头还望淡定,淡定~~
基本知识介绍
颜色直方图
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征,它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适用于描述那些难以进行自动分割的图像。
灰度直方图
灰度直方图是灰度级的函数,它表示图像中具有每种灰度级的像素的个数,反映图像中每种灰度出现的频率。灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频率,是图像的最基本的统计特征。
本文中即是使用灰度直方图来计算图片相似度,关于算法那一块也不赘言了,毕竟图像学图形学,直方图我是门儿都不懂,我也不准备打肿脸充胖子,只想实现一个最基本的算法,然后从最直观的角度看看这个算法的有效性,仅此而已。
算法实现
诸位看官休怪笔者囫囵吞枣,浅尝辄止的学习态度。额毕竟是因兴趣而来,于此方面并无半点基础(当然,除了知道RGB是啥玩意儿——这还幸亏当年计算机图形学的老师是个Super美女,因此多上了几节课的缘故),更谈不上半点造诣,看官莫怪莫怪,且忍住怒气,是走是留,小生不敢有半点阻拦~~
大致步骤如下:
1, 将图像转换成相同大小,以有利于计算出相像的直方图来
2, 计算转化后的灰度直方图
3, 利用XX公式,得到直方图相似度的定量度量
4, 输出这些不知道有用没用的相似度结果数据
代码实现
步骤1, 将图像转化成相同大小,我们暂且转化成256 X 256吧。
public Bitmap Resize(string imageFile, string newImageFile)
{
img = Image.FromFile(imageFile);
Bitmap imgOutput = new Bitmap(img, 256, 256);
imgOutput.Save(newImageFile, System.Drawing.Imaging.ImageFormat.Jpeg);
imgOutput.Dispose();
return (Bitmap)Image.FromFile(newImageFile);
}
这部分代码很好懂,imageFile为原始图片的完整路径,newImageFile为强转大小后的256 X 256图片的路径,为了“赛”后可以看到我们转化出来的图片长啥样,所以我就把它保存到了本地了,以至于有了上面略显丑陋的代码。
步骤2,计算图像的直方图
public int[] GetHisogram(Bitmap img)
{
BitmapData data = img.LockBits( new System.Drawing.Rectangle( 0 , 0 , img.Width , img.Height ), ImageLockMode.ReadWrite ,PixelFormat.Format24bppRgb );
int[ ] histogram = new int[ 256 ];
unsafe
{
byte* ptr = ( byte* )data.Scan0;
int remain = data.Stride - data.Width * 3;
for( int i = 0 ; i < histogram.Length ; i ++ )
histogram[ i ] = 0;
for( int i = 0 ; i < data.Height ; i ++ )
{
for( int j = 0 ; j < data.Width ; j ++ )
{
int mean = ptr[ 0 ] + ptr[ 1 ] + ptr[ 2 ];
mean /= 3;
histogram[ mean ] ++;
ptr += 3;
}
ptr += remain;
}
}
img.UnlockBits( data );
return histogram;
}
这段就是惊天地泣鬼神的灰度直方图计算方法,里面的弯弯绕还是留给诸位自己去掺和。
步骤3,计算直方图相似度度量
这一步骤的法宝在于这个:
Sim(G,S)= 其中G,S为直方图,N 为颜色空间样点数
为了大家少敲两行字儿,也给出一堆乱七八糟的代码:
//计算相减后的绝对值
private float GetAbs(int firstNum, int secondNum)
{
float abs = Math.Abs((float)firstNum - (float)secondNum);
float result = Math.Max(firstNum, secondNum);
if (result == 0)
result = 1;
return abs / result;
}
//最终计算结果
public float GetResult(int[] firstNum, int[] scondNum)
{
if (firstNum.Length != scondNum.Length)
{
return 0;
}
else
{
float result = 0;
int j = firstNum.Length;
for (int i = 0; i < j; i++)
{
result += 1 - GetAbs(firstNum[i], scondNum[i]);
Console.WriteLine(i + "----" + result);
}
return result/j;
}
}
步骤4,输出
这个……诸位爱怎么输出就怎么输出吧。直接Console也好,七彩命令行输出也罢,亦或者保存到文本文件中留作纪念啦啦,诸位“好自为之”~~
算法测评
真对不住大家,忘了跟大家说,我也不是一个专业的算法测评人员,但是作为一个半拉子测试人员免不了手痒痒想要看看这个算法到底有多大能耐,就拿出几张图片出来验验货吧。
以下是算法测评结果。以下部分内容话带调侃,绝无恶意,开开玩笑,娱乐大众~~
路人甲 |
路人乙 |
图像相似度 |
恶搞点评 |
100% |
里面什么都没有!? 恭喜你,如果你看不出来这是两张白底图片,那么你还真是小白,因为你连自家人都认不出来啊~~ |
||
100% |
天下乌鸦一般黑,这个算法在这一点上立场还算坚定,表现不错~ |
||
100% |
碰到Win7也不动心,意志坚定地给出了100%的正确答案。 这算法比我意志坚定多了,我可是win7刚出来个7000就装了,还一直用到现在,不过确实好用~~ |
||
88.84% |
明明很不一样的“我”跟“你”摆在那里,怎么就相似度这么高咧?? 难道,“我”,“你”都认不出来?? 哦,我忘了,这两张图片的大背景是一样的,难怪…… |
||
16.08% |
MS跟Apple这么水火不相容? 【均使用默认桌面~~】 |
||
50.64% |
终于了解了Jack跟Rose不能在一起的真正原因: 不是爱的不够深,也不是泰坦尼克号沉了,用老妈的话说“没有‘夫妻’相” —— 还是老妈这个过来人老道~~ |
||
99.21% |
哇,太不可思议了,竟然是这样。 这算法这样“黑”“白”不分?? 我得向Jack跟Rose的忠实Fans道歉了,上面的话是一时失言~~祝他们俩白头偕老,下辈子千万别做船了,坐船也不出海,出海也不去北极,…… |
经过我略显玩世不恭的测评活动,说实话,我对这个算法是相当的失望,尤其是最后一次对比中的结果,目前情绪低落中。这倒不是说这算法的一无是处,应该是我或者某些前辈用错了地方,个人觉得算法使用的局限性太大,也或许是我的期望值太高了吧。
后记
开始看到这玩意儿的时候觉得这玩意儿很简单啊,可是一想不对劲,没有这么容易的事情,要不Google,MS这些大牛们做了这么久还没有像样的玩意儿出来。果不其然,为了多了解一点相关的内容,我不得不Google了一下,觉得那些术语完全不知所云,看不懂啊;看来我得祭出我一般不使用的大杀器了——百度一搜。嘿,还真找出来了一堆东西,比Google上面的看起来容易多了,可是打开链接进去瞅瞅,发现还是非我当前能力之所及。没学到东西,但是好歹还是了解了一点皮毛上的皮毛。
全文完
诸位看官若觉得讲得没有意义,浪费了你的时间,那就权当作冷笑话听听缓解一下紧张的神经~~
参考链接:
http://blog.csdn.net/lanphaday/archive/2008/04/24/2325027.aspx
http://www.cnblogs.com/wuchaodong/archive/2009/04/28/1444792.html转
图像相似度算法的C#实现及测评相关推荐
- linux图片相似度检测软件下载,移动端图像相似度算法选型
概述 电商场景中,卖家为获取流量,常常出现重复铺货现象,当用户发布上传图像或视频时,在客户端进行图像特征提取和指纹生成,再将其上传至云端指纹库对比后,找出相似图片,杜绝重复铺货造成的计算及存储资源浪费 ...
- pythonopencv人脸相似度_图像相似度算法的个人见解(pythonopencv)-Go语言中文社区...
简述 前段时间写了篇博文 哈希算法实现图像相似度比较(Python&OpenCV) ,使用简单的哈希算法进行图像相似度判断.但是在实践中该算法达不到预期的效果: 图像缩放8*8大小,图片信息内 ...
- 图像置乱之评价图像置乱度算法的选择
一.图像置乱度 所谓"图像置乱",就是将图像的信息次序打乱,将a像素移动到b像素的位置上,b像素移动到c像素的位置上--使其变换成杂乱无章难以辨认的图像. 目前对于置乱的研究主要集 ...
- OpenCV—python 图像相似度算法(dHash,方差)
文章目录 一.SIFT综述 二.哈希算法(perceptual hash algorithm) 2.1 相似图片检测步骤: 2.2 代码实现 三.使用方差检测图像相似度 3.1 实现步骤 3.2 代码 ...
- 深入学习图像处理——图像相似度算法
最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...
- 图像相似度算法--SIFT算法详解
尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd zddmail@gmail.com or (zddhu ...
- 【含泪提速!】一文全解相似度算法、跟踪算法在各个AI场景的应用(附代码)
大家好,我是cv君,大家是否为深度学习算法速度感到困扰?本次cv君倾力分享一个优秀的方法,通过相似度+跟踪方案优化速度问题,并提高了检测.分割算法稳定性,附带代码,一起肝起来吧~ 今天给大家全解一下图 ...
- CV之FD之HOG:图像检测之基于HOG算法、简介、代码实现(计算图像相似度)之详细攻略
CV之FD之HOG:图像检测之基于HOG算法.简介.代码实现(计算图像相似度)之详细攻略 图像检测之基于HOG算法.简介.代码实现(计算图像相似度)之详细攻略 相关文章:CV之FD之HOG:图像检测之 ...
- (二十三)图像相似度比较哈希算法
图像相似度比较哈希算法 相似图像搜索的哈希算法有三种: 1.均值哈希算法 2.差值哈希算法 3.感知哈希算法 什么是哈希(Hash) • 散列函数(或散列算法,又称哈希函数,英语: Hash Func ...
最新文章
- AI如果耍起了心眼,人类就像个白痴......
- 移动端给img加上max-width:100%
- 做谷歌地图是获得Map key的方法
- 如何使用MiniProfiler(附最新版MiniProfiler使用心得)
- android: 动态加载碎片布局的技巧
- JDBC链接MySQL数据库
- POS58热敏打印解决方法
- 《基于机器视觉的高压输电线路覆冰厚度检测》论文笔记
- java web报表开发_2020主流JAVA WEB报表工具对比
- WebSphere概述
- 免费搭建个人网站流程!马上拥有自己的网站!
- 柴静《看见》读书笔记
- socket closed
- 163点游戏python算法
- 用Python求1~1万范围内的勾股数元组
- Keil5-MDK调用函数时代码自动补全功能及注意事项
- Mybatis中column用法
- 在线音乐播放器app
- DICOM图像的理解与学习
- Matlab 多元线性回归
热门文章
- c支限界算法语言n皇后问题分,算法(八)-回溯法-N皇后问题
- 线上服务CPU100%问题快速定位实战(转载公众号:架构师之路)
- 02_Nginx基本配置与参数说明 + 辅助命令
- CSS中让一个div的高度随着另外个一个统计的div的高度变化而变化的代码
- Spring管理session的一些认识和用法心得
- 新乡学院计算机田亮,2019届毕业论文答辩工作安排
- 钰群USB3.0音视频信号采集
- voc_eval.py:41: RuntimeWarning: invalid value encountered in greater_equal if np.sum(rec = t) ==
- python requests post提交数据报错
- docker WARNING: IPv4 forwarding is disabled. 解决方法