惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Palo Alto Networks Blog
D
Docker
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Schneier on Security
Engineering at Meta
Engineering at Meta
I
InfoQ
L
LangChain Blog
Cyberwarzone
Cyberwarzone
T
Tenable Blog
WordPress大学
WordPress大学
P
Privacy & Cybersecurity Law Blog
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Jina AI
Jina AI
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
博客园 - 三生石上(FineUI控件)
酷 壳 – CoolShell
酷 壳 – CoolShell
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Last Watchdog
The Last Watchdog
Last Week in AI
Last Week in AI
Cloudbric
Cloudbric
S
SegmentFault 最新的问题
爱范儿
爱范儿
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 叶小钗
AI
AI
T
Tor Project blog
I
Intezer
T
Threatpost
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
Visual Studio Blog
N
News and Events Feed by Topic
Latest news
Latest news
S
Security Affairs
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
B
Blog RSS Feed
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
S
Securelist

博客园 - 说不得

折腾了两天的跨站脚本提交问题,与IIS7有关 MongoDB 服务启动时指定dbpath DataGridView绑定行号 【转帖】三种决不能放进数据库的东西 Func<T, TResult>的一个使用场合 没别的,来张截图好了 SqlBulkCopy使用心得 使用两个信号量实现主线程和线程池同步 VS2010 出现错误提示“Error Creating Control - Object reference not set to an instance of an objec” 的解决方法 SQLite.Net操作类 Win7 下使用 SQLite Expert 操作C盘下的数据库发生错误:Attempt to write a readonly database. C#查找某一窗口并按钮 再见,Google 使用ManagedSpyLib监视.net程序中控件属性的变化 使用c#把一个32位整数按位相加最快的方法是什么? 关于变量在循环内声明还是在循环外声明 轻量级分页控件 安装sqlserver2008时出现“Rule "Previous releases of Microsoft Visual Studio 2008" failed.”错误的解决办法 最近见过的垃圾代码 - 说不得 - 博客园
计算两张黑白图片的相似度
说不得 · 2010-01-20 · via 博客园 - 说不得

如果有两张分辨率为32x32的黑白图片,要计算这两张图片的相似度该怎么办?

根据这篇文章《数学之美 系列 12 - 余弦定理和新闻的分类》的介绍,我们只需要计算一下两个1024位(32x32=1024)的向量之间的夹角的余弦即可,结果越接近于1,相似度就越高。

好了,理论基础有了,下面说怎么存储我们的向量。

因为图片上只有两种颜色,所以用1位二进制足以表示。那就认为白色的点为0,黑色的点为1。这样,我们每一张图片就可以放在32个32位整数里,每行用一个整数表示,既节省了空间,又降低了操作时的复杂度。

接下来说如何计算。

如果老老实实的按照以下公式进行计算,我们需要取出整数中相应位的值,然后相乘或者分别平方,显然这种方法很浪费时间。

我们来看看有没有什么简便方法。

因为我们只有0或者1两种值,所以,分子中的相应位分别相乘,就可以转化为相应位进行与运算,又因为我们使用了整型存储,所以计算进一步简化为两个整数按位与。

而分母中的按位分别平方然后相加,就可以省掉平方的操作,直接按位相加了。

因此,整个程序的操作过程就可以按照如下步骤进行:

1.将每张图片按像素存放到一个长度为32的32位整型数组里面,每个整数存放一行,整数的每位存放一个像素值(0或者1);

2.计算分子时,将两个这样的数组中的整数按照对应的索引分别按位与,然后将计算结果按位相加;

3.计算分母时,将每个数组中的所有整数按位相加,然后开根号,最后相乘;

4.分子除以分母,得出余弦值。

第2、3、4步的代码如下:

代码

public double GetCosine(int[] e1, int[] e2)
{
    
int a = 0;//分母1
    int b = 0;//分母2
    int c = 0;//分子
    for (int y = 0; y < 32++y)
    {
        
//两个数组中的整数按位与
        int i = e2[y] & e1[y];
        
//按位加
        for (int x = 1; x < 33++x)
        {
            c 
+= (i >> x) & 1;
            a 
+= (e2[y] >> x) & 1;
            b 
+= (e1[y] >> x) & 1;
        }
    }
//计算分母
    int d = a * b;return d == 0 ? 0 : c / Math.Sqrt(d);
}

如果看到了这里,你已经知道了我们该如何计算两个图片的相似度,按我的经验,计算结果超过0.8,就可以认为这两个图片一样了。

如果把这里的图片换成验证码,而你碰巧已经知道其中一个验证码的值,那么另外一个验证码的值你现在也知道了。