【云计算】用汉明距离做近似图像识别实际步骤流程
小标 2019-02-11 来源 : 阅读 529 评论 0

摘要:本文主要向大家介绍了【云计算】用汉明距离做近似图像识别实际步骤流程,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】用汉明距离做近似图像识别实际步骤流程,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


这篇文章写作于2016年12月,今天整理博客才发现它一直静静地躺在我的草稿箱里。第一次了解汉明距离好像是在数电课上,老师在讲编码的原理?记不太清了。后来做毕设时,老师希望我在我的设计中添加一个判断走势图是否相近似的小程序。



汉明距离


用于编码,简单来说,判断两个序列是否相似,则判断是否有不同的位数。举例:


A = [0, 0, 1, 0]
B = [0, 1, 1, 0]


则AB有一位不同,汉明距离为1。

又比如:


A = [3,1,4,1,5,9]
B = [2,7,1,8,2,8]


很好,他们完全不一样,汉明距离为6。



算法大概过程


缩小图片尺寸,假如设成8*8,那么最后得到64位字符串 简化色彩,也就是把图像变灰 计算平均值 比较灰度,与平均值进行比较。大于等于平均值记为1;小于平均值记为0。 比较哈希值(也就是汉明距离)

在实际实施算法时,有三种方法。



三种哈希算法


判断图像近似的哈希算法共有三种:A/D和P

A 指的是平均:average

D 指的是差异:diff

P 是指感知:perceptual

最推荐的是D,A仅计算平均值,误差很大。P的计算过慢。



计算灰度值的方法


R是red,G是green,B=blue,分别代表rgb图像中的三原色


浮点算法:R*0.3+G*0.59+B*0.11 整数方法:(R*30+G*59+B*11) /100 移位:(R*76+G*151+B*28) >>8 平均值方法:(R+G+B)/3 仅取原谅方法:G


这里就贴代码好了。


平均哈希(A)


from skimage import transform
import cv2
#aHash方法计算图片的指纹数据

img=cv2.imread('/Users/myname/Desktop/test/d.jpg')#读入图片
length = 8
height = 8
sum = 0.0
k = 0
grey = []
# 修改图像大小
dst=transform.resize(img, (length, height))

for i in range(length):
    for j in range(height):
        (b,g,r) = dst[i,j]
        # 计算灰度值
        grey.append(r*0.3+g*0.59+b*0.11)#浮点灰度值计算
        sum+=grey[k]
        k=k+1
average = sum/(length*height)#算出平均的灰度数据
fingerprint = []

for i in range(length*height):
    if grey[i] > average:
        fingerprint.append(1)#如果灰度数据大于平均值,填入元素1,否则填入元素0
    else:
        fingerprint.append(0)

print(fingerprint)


差异哈希(D)


基于渐变实现的差异算法,速度快。

1. 缩小图片至8行9列,9*8,为什么是9*8?因为在第三步要用

2. 转灰度图

3. 计算差异值:每行相邻像素之间计算差值,这样就变成(9-1)*8=64

4. 获取01值。


from skimage import transform,data
import matplotlib.pyplot as plt
from skimage import io
import cv2
img=cv2.imread('/Users/myname/Desktop/test/d.jpg')#读入图片
length = 9
height = 8
sum = 0.0
k = 0
grey = []
dst=transform.resize(img, (length, height))
#灰度图转化
for i in range(length):
    for j in range(height):
        (b,g,r) = dst[i,j]
        grey.append(r*0.3+g*0.59+b*0.11)#浮点灰度值计算
        sum+=grey[k]
        k=k+1
# 获取每行的差值,为64位
differ = []
for i in range(length-1):#i 8
    for j in range(height):#j 8
        differ.append(grey[j*8+i+1]-grey[j*8+i])
#获取01值
fingerprint = []
for i in range((length-1)*height):#8*8
    if differ[i] > 0:
        fingerprint.append(1)
    else:
        fingerprint.append(0)

#print(fingerprint)


感知哈希(P)


对图像生成一个字符串代表他的“指纹”。通过比对“指纹”来比较图像的相似性。

1. 缩小时建议32*32,方便DCT计算

2. 转灰度图

3. 计算DCT

4. 缩小DCT,保留左上角8*8的像素。

5. 计算平均值

6. 判断各点,大于等于平均值为1,小于为0

7. 得到64个信息位


import cv2
from skimage import transform
import numpy as np
#利用phash计算图像指纹
img=cv2.imread('/Users/lixuefei/Desktop/test/d.jpg')#读入图片

length = 32
s_length = 8

dst=transform.resize(img, (length, length))
#print(type(dst))

#all 代表全图,建议32*32
matrix_all_grey = [[0 for i in range(length)] for i in range(length)]
#small 代表最低频率,8*8大小
matrix_small_grey = [[0 for i in range(s_length)] for i in range(s_length)]

# 灰度图转化
k = 0
for i in range(length):
    for j in range(length):
        (b,g,r) = dst[i,j]
        matrix_all_grey[i][j] = ( b + g + r )/3
# 缩小
fft_matrix_grey = np.fft.fft(matrix_all_grey)
for i in range(s_length):
    for j in range(s_length):
        matrix_small_grey[i][j] = fft_matrix_grey[i][j]
# 计算平均
sum_pixel = 0
for i in range(s_length):
    for j in range(s_length):
        sum_pixel += matrix_small_grey[i][j]
average = sum_pixel / (s_length*s_length)

bite = []

#赋予01值
for i in range(s_length):
    for j in range(s_length):
        if matrix_small_grey[i][j] > average :
            bite.append(1)
        else:
            bite.append(0)
print(bite)


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程