感知哈希算法——Python实现【转】
转自:https://blog.csdn.net/m_buddy/article/details/78887248
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m_buddy/article/details/78887248
1. 前言
现在手中只有一张图像需要在一个集合中去找到与之最相近的那一张,这个过程实际是一个匹配的过程,特别是在多模态医学图像中解决这样的问题是比较迫切的,今年试验了一种广泛使用的算法——感知哈希算法!具体的实验结果将在下文中给出。
2. 算法原理
step1:缩小图片尺寸
将图片缩小到8x8的尺寸, 总共64个像素. 这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息。
step2:转为灰度图片
将缩小后的图片, 转为64级灰度图片。
step3:计算灰度平均值
计算图片中所有像素的灰度平均值
step4:比较像素的灰度
将每个像素的灰度与平均值进行比较, 如果大于或等于平均值记为1, 小于平均值记为0。
step5:计算哈希值
将上一步的比较结果, 组合在一起, 就构成了一个64位的二进制整数, 这就是这张图片的指纹。
step6:对比图片指纹
得到图片的指纹后, 就可以对比不同的图片的指纹, 计算出64位中有多少位是不一样的. 如果不相同的数据位数不超过5, 就说明两张图片很相似, 如果大于10, 说明它们是两张不同的图片。
3. Python实现
# -*- coding=utf-8 -*-
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# extract feature
# lines: src_img path
def Extra_Featrue(lines, new_rows=64, new_cols=64):
for name in lines:
ori_img = Image.open(name.strip())
feature_img = ori_img.resize((new_rows, new_cols))
feature_img = feature_img.convert('L')
mean_value = np.mean(np.mean(feature_img))
feature = feature_img >= mean_value
feature = np.matrix(feature, np.int8)
if 'features' in locals():
temp = np.reshape(feature, (1, new_cols * new_rows))
features = np.vstack([features, temp])
else:
features = np.matrix(np.reshape(feature, (1, new_cols * new_rows)))
return features
# use MRI image features to find candidate CT images
def MRIFindCT(mri_feature, mri_lines, ct_feature, ct_lines):
for i in np.arange(0, np.shape(mri_feature)[0]):
dist = []
mri = mri_feature[i, :]
for j in np.arange(0, np.shape(ct_feature)[0]):
ct = ct_feature[j, :]
temp = mri != ct
sum = np.sum(temp)
dist.append(sum)
# find minimum while ignoring the zeros on the diagonal
index = np.argsort(dist)
img1_path = mri_lines[i]
img2_path = ct_lines[index[1]]
img3_path = ct_lines[index[2]]
img4_path = ct_lines[index[3]]
img1 = Image.open(img1_path)
img2 = Image.open(img2_path)
img3 = Image.open(img3_path)
img4 = Image.open(img4_path)
plt.subplot(2, 2, 1)
plt.imshow(img1)
plt.title('MRI Image(%s)' % img1_path[img1_path.__len__() - 10:])
plt.axis('off')
plt.xlabel(img1_path[img1_path.__len__() - 10:])
plt.subplot(2, 2, 2)
plt.imshow(img2)
plt.title('Candidate CT Image1(%s)' % img2_path[img2_path.__len__() - 10:])
plt.axis('off')
plt.xlabel(img2_path[img2_path.__len__() - 10:])
plt.subplot(2, 2, 3)
plt.imshow(img3)
plt.title('Candidate CT Image2(%s)' % img3_path[img3_path.__len__() - 10:])
plt.axis('off')
plt.xlabel(img3_path[img3_path.__len__() - 10:])
plt.subplot(2, 2, 4)
plt.imshow(img4)
plt.title('Candidate CT Image3(%s)' % img4_path[img4_path.__len__() - 10:])
plt.axis('off')
plt.xlabel(img4_path[img4_path.__len__() - 10:])
plt.show()
# set data source
src_path = './1794-MR/MR.txt' # *.txt file contain MRI images
dst_path = './1794-CT/CT.txt' # *.txt file contain CT images
mri_lines = [line.strip() for line in open(src_path)]
ct_lines = [line.strip() for line in open(dst_path)]
# extract feature
set_size = 8
mri_feature = Extra_Featrue(mri_lines, set_size, set_size)
ct_feature = Extra_Featrue(ct_lines, set_size, set_size)
# use feature to find candidate img
MRIFindCT(mri_feature, mri_lines, ct_feature, ct_lines)
4. 结果
上面已经将算法的原理介绍了,很简单实现起来也很容易。这里给出几幅实验的结果作为参考
case1:
case2:
从结果可以看到在一些图片中匹配的效果并不是很好,应该是抽取的特征致使匹配的结果出现偏差
————————————————
版权声明:本文为CSDN博主「m_buddy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m_buddy/article/details/78887248
感知哈希算法——Python实现【转】的更多相关文章
- 感知哈希算法 python 3.4
#!/usr/bin/python # -*- coding: UTF-8 -*- #Less than 10 add to list and sort import glob import os i ...
- 感知哈希算法的java实现
一.原理讲解 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹 ...
- 谷歌百度以图搜图 "感知哈希算法" C#简单实现
/// <summary> /// 感知哈希算法 /// </summary> public class ImageComparer { /// <summary> ...
- Iconfinder 如何杜绝盗版,哈希算法检测图像重复
原地址:http://blog.jobbole.com/65914/ 本文由 伯乐在线 - 小鱼 翻译自 Silviu Tantos.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读 ...
- 压缩感知重构算法之IRLS算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之OLS算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之CoSaMP算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之IHT算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 压缩感知重构算法之SP算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
随机推荐
- nginx 图片访问404 (使用location中使用 root,alias的区别)
问题描述: 在/data/code_img/文件下有很多验证码图片,想将他们展示出来 希望通过 http://127.0.0.1/img/1.png 这种形式访问到对应图片,刚开始nginx中配置如下 ...
- 26.Java基础_状态修饰符
状态修饰符: final(最终态),static(静态) final关键字: 修饰类: 修饰局部变量: static关键字: 修饰变量: 修饰函数:
- 【洛谷P1963】[NOI2009]变换序列(二分图匹配)
传送门 题意: 现有一个\(0\)到\(n-1\)的排列\(T\),定义距离\(D(x,y)=min\{|x-y|,N-|x-y|\}\). 现在给出\(D(i, T_i)\),输出字典序最小的符合条 ...
- vmvare虚拟机篇
新建虚拟机-典型-稍后安装-Linux-管理-从磁盘删除-虚拟机名称-位置- 安装Tools-用于虚拟机和本地文件共享和传送 网络适配器桥接模式-桥接本地网卡 NAT模式-再重新连接本地网卡 仅主机模 ...
- Vue介绍(一)
官网:https://cn.vuejs.org/ Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.V ...
- MySQL SQL DLL (数据定义语言)
CREATE CREATE DATABASE CREATE DATABASE 用于创建数据库 CREATE DATABASE new_database_name; CREATE TABLE CREAT ...
- 重构与模式 (Joshua Kerievsky 著)
第1章 本书的写作缘由 第2章 重构 第3章 模式 第4章 代码坏味 第5章 模式导向的重构目录 第6章 创建 第7章 简化 第8章 泛化 第9章 保护 第10章 聚集操作 第11章 实用重构 参考文 ...
- jdk自带监控程序jvisualvm的使用
监控小程序的配置 生产环境tomcat的配置 编辑应用所在的tomcat服务器下的bin目录下的catalina.sh文件,修改如下: 配置如下内容: export JAVA_OPTS="- ...
- 记一次SQL调优
insert优化 如果你在某一时刻有大量的insert操作,一条一条插入是非常耗时的.insert语句本身支持一次插入很多条记录,插入记录数上限受sql语句长度限制,一般一次插个几千条是没问题的.在我 ...
- PHP-内嵌foreach的巧妙优化
1.没有想好使用什么话题做开场白,不说多废话直接上代码了. 这是tp5.1的api接口里的代码,$user_list 是二维数组只有 1104一维数组数据 $friend_list 也是二维数组, ...