转自: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. CentOS离线安装Rust

    条件所限,无法在线连接外网,或是下载慢,容易中断时,可以采用. 一,下载离线安装包 https://forge.rust-lang.org/other-installation-methods.htm ...

  2. input:file样式怎样修改

    问题描述: 我需要点击input:file来修改img中的图片,但是input:file样式太丑 解决办法: 给file设置透明度为0,让用户看不见他 创建新的button按钮 修改button按钮样 ...

  3. 2016年蓝桥杯B组C/C++决赛题解

    2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...

  4. css3/sass 样式记录

    css3 width: calc(50% - 10px) sass 1.奇偶行 .classNameA { background:red; &:nth-child(even) { backgr ...

  5. 《Verilog数字系统设计教程(第2版).pdf》

    Verilog数字系统设计教程(第2版).pdf https://github.com/shigh1005/pdf_book <Linux设备驱动开发详解:基于最新的Linux 4.0内核.pd ...

  6. 剑指Offer-18.二叉树的镜像(C++/Java)

    题目: 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ ...

  7. 解决node fs.writeFile 生成csv 文件乱码问题

    解决node fs.writeFile 生成csv 文件乱码问题: fs.writeFile('xxx.csv', '\ufeff' + 要传入的数据, {encoding: 'utf8'}); \u ...

  8. 《Web前端开发》等级考试样题~以国家“1+X”职业技能证书为标准,厚溥推出Web前端开发人才培养方案

    1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http ...

  9. Leetcode练习题Two Sum

    1 Two Sum: Question Solution 知识点总结 常见方法 HashMap由value获得key Question: Given an array of integers, ret ...

  10. Vue.js 源码分析(二十七) 高级应用 异步组件 详解

    当我们的项目足够大,使用的组件就会很多,此时如果一次性加载所有的组件是比较花费时间的.一开始就把所有的组件都加载是没必要的一笔开销,此时可以用异步组件来优化一下. 异步组件简单的说就是只有等到在页面里 ...