通过imagehash模块中whash()函数直接调用得到的是16进制的字符串,通过源码可以知道是将只有0或者1的矩阵转化成了16进制的字符串,代码如下:
def _binary_array_to_hex(arr):
    """
    internal function to make a hex string out of a binary array.
    binary array might be created from comparison - for example, in
    average hash, each pixel in the image is compared with the average pixel value.
    If the pixel's value is less than the average it gets a 0 and if it's more it gets a 1.
    Then we treat this like a string of bits and convert it to hexadecimal.
    """
    h = 0
    s = []
    for i, v in enumerate(arr.flatten()):
        if v:
            h += 2**(i % 8)
        if (i % 8) == 7:
            s.append(hex(h)[2:].rjust(2, '0'))
            h = 0
    return "".join(s)

将数组转化成字符串的形式,以及字符串转化成数组
#-*- coding:utf-8 -*-
from PIL import Image
import imagehash
from numpy import *
def hashToStr(hh):
    s = []
    for i in range(8):
        for j in range(8):
            y = int(hh[i][j])
            s.append(str(y))
    return "".join(s)
def strToHash(strh):
    l = []
    if len(strh) != 64:
        emsg = 'Expected str string size of {}'
        raise ValueError(emsg.format(64))
    ll = []
    for i in range(len(strh)):       
        if len(ll) == 8:
            l.append(ll)
            ll = []
            ll.append(int(strh[i]) > 0)
        else:
            ll.append(int(strh[i]) > 0)
    l.append(ll)
    return imagehash.ImageHash(array(l))
if __name__ == '__main__':
    img = Image.open('C:/Users/wanglx1/workspace/imagehash/similarity/3.jpg')
    h = imagehash.phash(img)
    print('h :',h)   #得到的hash是一个8*8的数组,不过此时的h是一个imagehash的对象
    # ('h :', array([[ True, False, False,  True, False, False,  True, False],
 #       [ True,  True, False, False,  True,  True,  True, False],
 #       [ True, False,  True,  True, False, False,  True,  True],
 #       [False, False,  True,  True, False, False,  True,  True],
 #       [ True,  True, False, False,  True, False,  True, False],
 #       [ True,  True, False,  True, False, False,  True,  True],
 #       [ True, False, False,  True,  True, False, False,  True],
 #       [False, False, False,  True, False,  True, False, False]], dtype=bool))
     print('h.hash :',h.hash)
     # ('h.hash :', array([[ True, False, False,  True, False, False,  True, False],
  #      [ True,  True, False, False,  True,  True,  True, False],
  #      [ True, False,  True,  True, False, False,  True,  True],
  #      [False, False,  True,  True, False, False,  True,  True],
  #      [ True,  True, False, False,  True, False,  True, False],
  #      [ True,  True, False,  True, False, False,  True,  True],
  #      [ True, False, False,  True,  True, False, False,  True],
  #      [False, False, False,  True, False,  True, False, False]], dtype=bool))
     #对外操作,要用h.hash才可以。
     #想知道为什么看源码就明白了。
     hh = h.hash
     strh = hashToStr(hh)
     print('strh :',strh) #输出二进制字符串
#('strh :', '1001001011001110101100110011001111001010110100111001100100010100')
    hashh = strToHash(strh)  #此时得到的是ImageHash的对象,可以使用ImageHash类定义的函数进行运算
    print('hashh :',hashh.hash)
    # ('hashh :', array([[ True, False, False,  True, False, False,  True, False],
 #       [ True,  True, False, False,  True,  True,  True, False],
 #       [ True, False,  True,  True, False, False,  True,  True],
 #       [False, False,  True,  True, False, False,  True,  True],
 #       [ True,  True, False, False,  True, False,  True, False],
 #       [ True,  True, False,  True, False, False,  True,  True],
 #       [ True, False, False,  True,  True, False, False,  True],
 #       [False, False, False,  True, False,  True, False, False]], dtype=bool))
    print(shape(hashh.hash))
    #(8L, 8L)
  • arr是一个数组,flatten()是将数组转化成一个向量
  • 关于flatten在数组矩阵列表中的用法如下:
b = [[1,2,3],[4,5,6]]
b = mat(b)
print (b)
#[[1 2 3]
# [4 5 6]]
print('b',b.flatten())  #对矩阵
#('b', matrix([[1, 2, 3, 4, 5, 6]]))
print (shape(b.flatten()))
#(1L, 6L)
a = array([[1,2],[3,4]]) #数组
print ('sdfs',a.flatten())
#('sdfs', array([1, 2, 3, 4]))
print (shape(a.flatten()))
#(4L,)
c = [[1,2,4],[5,6,7]] #列表 有错误
print c
# print c.flatten()
#AttributeError: 'list' object has no attribute 'flatten'

图像哈希二进制字符串相互转换以及flatten()的用法相关推荐

  1. C++ 字节流与二进制字符串相互转换(一个简单的明文加解密程序)

    1.想法由来 作为一名程序猿,在我们写文章.文字片段或者一句简短的话语,对外发表或者告之他人时,是否想过带点新意和创意呢?如果想过,那么这篇文章会给你一点帮助. 本文介绍的是一个简单的将明文与二进制字 ...

  2. mysql存图片二进制文件_将图片(二进制文件)存储于数据库,论文件字节流与二进制字符串相互转换...

    开发中遇到存储图片文件于数据库这样的需求. 我们知道文件本身就是一份二进制数据,不同类型的文件只是编码形式不同,对应的解读形式不同,无论txt文件.jpg文件亦或是mp4文件,本质上都是0和1组成的. ...

  3. java网络图片与二进制字符串相互转换

    /** * @Title           getImgeHexString * @Description     网络图片转换成二进制字符串 * @param URLName   网络图片地址 * ...

  4. VB 二进制数组与十六进制字符串相互转换

    1.VB 二进制Byte()数组转换成十六进制字符串函数: Private Function BytesToHex(bytB() As Byte) As String Dim strTmp As St ...

  5. Java 二进制与十六进制字符串相互转换

    1.二进制转十六进制 输入:二进制字符串 输出:十六进制字符串 public class Bin2Hex {public static void main(String[] args){String ...

  6. 字符串和二进制串相互转换(C++)

    一.字符转化成二进制 #include <iostream> #include <bitset>using namespace std;int main() {//字符转化成二 ...

  7. 使用Python,OpenCV进行图像哈希

    使用Python,OpenCV进行图像哈希 1. 效果图 2. 原理 3. 源代码 参考 这篇博客将介绍图像哈希,感知哈希以及这些算法如何用于(快速)确定图像的视觉内容是否相同或相似.并实现了差异散列 ...

  8. 使用OpenCV,Python进行图像哈希(差分哈希 dHash)处理

    使用OpenCV,Phthon进行图像哈希处理的一个重要应用是去除重复的图像: 当你有多个相册的图片,进行合并时,so boring,有一些图片是重复的,肉眼来看太难删除了. 图像哈希可以帮助你完美的 ...

  9. LeetCode 1980. 找出不同的二进制字符串

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串数组 nums ,该数组由 n 个 互不相同 的二进制字符串组成,且每个字符串长度都是 n . 请你找出并返回一个长度为 n 且 没有出现 ...

  10. mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...

    一.char 和 varchar 区别 1.定长和变成 char:定长,长度固定:varchar:变长,长度可变: 当插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存 ...

最新文章

  1. juc java_深入理解JUC(java.util.concurrent)
  2. 使用emu8086学习汇编 int 21h 指令
  3. 堆栈和堆得区别与垃圾回收
  4. 征稿 | 国际KG大会 IJCKG 2021专辑征文
  5. 已经是最大股东却还要全资收购!腾讯看上了搜狗的啥?
  6. 盛辉智能机器人安全吗_人工智能真的安全吗?快看这些已经发出的警告
  7. 在ubuntu16.04安装hadoop集群时ssh不成功
  8. Win11系统Windows更新疑难解答出现问题怎么办?
  9. 【李宏毅2020 ML/DL】P26-33 Explainable ML
  10. Swift3.0语法1
  11. python def函数调用_Python - def 函数
  12. 移动端APP测试总结(二)
  13. 要善于借势破局——宁向东的清华管理学课第4课
  14. Teamcenter 与各种工具软件的集成解决方案
  15. 算术左移、算术右移、逻辑右移
  16. Qt学习笔记(五):菜单栏
  17. vue开发单页面应用
  18. 移动端长按文本选择复制
  19. winform窗体的键盘基本控制
  20. UPC10544: 凉宫春日的叹息

热门文章

  1. Ruby IDE及相关书籍
  2. 【带权二分】bzoj2654 tree
  3. POJ1177(扫描线求周长并)
  4. Java集合---ConcurrentHashMap原理分析
  5. char和char*
  6. J2EE项目中异常处理
  7. 《算法:C语言实现》阅读笔记
  8. python执行过程
  9. 在wamp集成环境中添加mysql操作记录
  10. matplotlib画图一行三个图