转自: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实现【转】的更多相关文章

  1. 感知哈希算法 python 3.4

    #!/usr/bin/python # -*- coding: UTF-8 -*- #Less than 10 add to list and sort import glob import os i ...

  2. 感知哈希算法的java实现

    一.原理讲解      实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹 ...

  3. 谷歌百度以图搜图 "感知哈希算法" C#简单实现

    /// <summary> /// 感知哈希算法 /// </summary> public class ImageComparer { /// <summary> ...

  4. Iconfinder 如何杜绝盗版,哈希算法检测图像重复

    原地址:http://blog.jobbole.com/65914/ 本文由 伯乐在线 - 小鱼 翻译自 Silviu Tantos.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读 ...

  5. 压缩感知重构算法之IRLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  6. 压缩感知重构算法之OLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  7. 压缩感知重构算法之CoSaMP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  8. 压缩感知重构算法之IHT算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  9. 压缩感知重构算法之SP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

随机推荐

  1. CodeForces - 1260C(贪心+思维)

    题意 https://vjudge.net/problem/CodeForces-1260C 有一串砖,凡是r的倍数而不是b的倍数必须涂红,凡是b的倍数而不是r的倍数必须涂蓝,是公倍数则选一个涂.把涂 ...

  2. Windows | Ubuntu18.04分别安装Matlab 2017b破解版

    首先下载好Windows和Ubuntu 版本的MATLAB 2017b 安装包, 1.Windows上安装,解压文件R2017b_win64_dvd1.iso和R2017b_win64_dvd2.is ...

  3. 攻防世界web-NaNNaNNaNNaN-Batman

    先把附件下载下来,然后打开,一堆js乱码 把最后的eval修改成alert,再将文件后缀修改成html,用浏览器打开,乱码变正常了 之后把js代码对齐一下,这里用这个网站进行对齐 https://be ...

  4. IntelliJ IDEA常用配置(三)

    提示:对于一些通用的设置可以配置成全局的. 1. 主题配置 File - Settings - Color Scheme,默认的是Default(一个白色主题),Darcula是一个黑色主题. 我们也 ...

  5. GraphSage:

    https://yq.aliyun.com/articles/712465?type=2 讲了最基本的概念: 1.b.常见的欧几里得结构化数据 将数据转换到欧几里得空间中,所得到的数据称为欧几里得结构 ...

  6. rabbit 发送者设置

    @Override public void sendUploadOssAndRiskDanger(String uuid, Object objectData) { try { rabbitTempl ...

  7. mac使用技巧和快捷键

    mac快捷键 shift+command+delete 清除缓存 shift+command+. 查看隐藏文件 ctrl+空格 切换输入法 shift+option+F11/F12 精细调节声音 fn ...

  8. CF1207F Koala and Notebook(BFS)

    你可能会好奇为什么只有一个 BFS 的标签,却还能够排到 F 的位置. 因为它实在是太 简 单 了 有更新 首先,比较两个数,可以先比较两个数的长度,然后比较两个数看成数字串后的字典序. 不妨先把每条 ...

  9. vue_day05

    目录 vue前后端交互: vue 分离前后端交互: vue前端发送请求: vue请求插件--axios: main.js配置: 前端朝后端请求传参方式: django后端返回数据样式: vue配置El ...

  10. 「ZJOI2019」浙江省选

    在八月来临前补完了zjoi2019 本来是想在八月前做完暑假作业的? 传送门 Description 给\(n\)条斜率为正的直线,询问每条直线是否在某处高度为前\(m\)名,如果是,询问最小排名 S ...