当前位置: 首页 > news >正文

phpcms网站转移/网络推广经验

phpcms网站转移,网络推广经验,成都三合一网站建设,个人可以做网站维护吗语言:python1.余弦相似度计算把图片表示成一个向量,通过计算向量之间的余弦距离来表征两张图片的相似度。# -*- coding: utf-8 -*- # !/usr/bin/env python # 余弦相似度计算 from PIL import Image from numpy import average, dot, linalg # 对图片进行…

e46c4322032938310758a4d4ebf8fc4c.png

语言:python

1.余弦相似度计算

把图片表示成一个向量,通过计算向量之间的余弦距离来表征两张图片的相似度。

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# 余弦相似度计算
from PIL import Image
from numpy import average, dot, linalg
# 对图片进行统一化处理
def get_thum(image, size=(64, 64), greyscale=False):# 利用image对图像大小重新设置, Image.ANTIALIAS为高质量的image = image.resize(size, Image.ANTIALIAS)if greyscale:# 将图片转换为L模式,其为灰度图,其每个像素用8个bit表示image = image.convert('L')return image
# 计算图片的余弦距离
def image_similarity_vectors_via_numpy(image1, image2):image1 = get_thum(image1)image2 = get_thum(image2)images = [image1, image2]vectors = []norms = []for image in images:vector = []for pixel_tuple in image.getdata():vector.append(average(pixel_tuple))vectors.append(vector)# linalg=linear(线性)+algebra(代数),norm则表示范数# 求图片的范数norms.append(linalg.norm(vector, 2))a, b = vectorsa_norm, b_norm = norms# dot返回的是点积,对二维数组(矩阵)进行计算res = dot(a / a_norm, b / b_norm)return res
image1 = Image.open('010.jpg')
image2 = Image.open('011.jpg')
cosin = image_similarity_vectors_via_numpy(image1, image2)
print('图片余弦相似度', cosin)

2.哈希算法计算图片的相似度

感知哈希算法是一类算法的总称,包括aHash、pHash、dHash。顾名思义,感知哈希不是以严格的方式计算Hash值,而是以更加相对的方式计算哈希值,因为“相似”与否,就是一种相对的判定。

几种hash值的比较:

  • aHash:平均值哈希。速度比较快,但是常常不太精确。
  • pHash:感知哈希。精确度比较高,但是速度方面较差一些。
  • dHash:差异值哈希。精确度较高,且速度也非常快

值哈希算法差值哈希算法感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同。三直方图单通道直方图的值为0-1,值越大,相似度越高。

import cv2
import numpy as np
from PIL import Image
import requests
from io import BytesIO
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as pltdef aHash(img):# 均值哈希算法# 缩放为8*8img = cv2.resize(img, (8, 8))# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# s为像素和初值为0,hash_str为hash值初值为''s = 0hash_str = ''# 遍历累加求像素和for i in range(8):for j in range(8):s = s+gray[i, j]# 求平均灰度avg = s/64# 灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if gray[i, j] > avg:hash_str = hash_str+'1'else:hash_str = hash_str+'0'return hash_strdef dHash(img):# 差值哈希算法# 缩放8*8img = cv2.resize(img, (9, 8))# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if gray[i, j] > gray[i, j+1]:hash_str = hash_str+'1'else:hash_str = hash_str+'0'return hash_strdef pHash(img):# 感知哈希算法# 缩放32*32img = cv2.resize(img, (32, 32))   # , interpolation=cv2.INTER_CUBIC# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将灰度图转为浮点型,再进行dct变换dct = cv2.dct(np.float32(gray))# opencv实现的掩码操作dct_roi = dct[0:8, 0:8]hash = []avreage = np.mean(dct_roi)for i in range(dct_roi.shape[0]):for j in range(dct_roi.shape[1]):if dct_roi[i, j] > avreage:hash.append(1)else:hash.append(0)return hashdef calculate(image1, image2):# 灰度直方图算法# 计算单通道的直方图的相似值hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i] != hist2[i]:degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))else:degree = degree + 1degree = degree / len(hist1)return degreedef classify_hist_with_split(image1, image2, size=(256, 256)):# RGB每个通道的直方图相似度# 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值image1 = cv2.resize(image1, size)image2 = cv2.resize(image2, size)sub_image1 = cv2.split(image1)sub_image2 = cv2.split(image2)sub_data = 0for im1, im2 in zip(sub_image1, sub_image2):sub_data += calculate(im1, im2)sub_data = sub_data / 3return sub_datadef cmpHash(hash1, hash2):# Hash值对比# 算法中1和0顺序组合起来的即是图片的指纹hash。顺序不固定,但是比较的时候必须是相同的顺序。# 对比两幅图的指纹,计算汉明距离,即两个64位的hash值有多少是不一样的,不同的位数越小,图片越相似# 汉明距离:一组二进制数据变成另一组数据所需要的步骤,可以衡量两图的差异,汉明距离越小,则相似度越高。汉明距离为0,即两张图片完全一样n = 0# hash长度不同则返回-1代表传参出错if len(hash1) != len(hash2):return -1# 遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i] != hash2[i]:n = n + 1return ndef getImageByUrl(url):# 根据图片url 获取图片对象html = requests.get(url, verify=False)image = Image.open(BytesIO(html.content))return imagedef PILImageToCV():# PIL Image转换成OpenCV格式path = "/Users/waldenz/Documents/Work/doc/TestImages/t3.png"img = Image.open(path)plt.subplot(121)plt.imshow(img)print(isinstance(img, np.ndarray))img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)print(isinstance(img, np.ndarray))plt.subplot(122)plt.imshow(img)plt.show()def CVImageToPIL():# OpenCV图片转换为PIL imagepath = "/Users/waldenz/Documents/Work/doc/TestImages/t3.png"img = cv2.imread(path)# cv2.imshow("OpenCV",img)plt.subplot(121)plt.imshow(img)img2 = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.subplot(122)plt.imshow(img2)plt.show()def bytes_to_cvimage(filebytes):# 图片字节流转换为cv imageimage = Image.open(filebytes)img = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)return imgdef runAllImageSimilaryFun(para1, para2):# 均值、差值、感知哈希算法三种算法值越小,则越相似,相同图片值为0# 三直方图算法和单通道的直方图 0-1之间,值越大,越相似。 相同图片为1# t1,t2   14;19;10;  0.70;0.75# t1,t3   39 33 18   0.58 0.49# s1,s2  7 23 11     0.83 0.86  挺相似的图片# c1,c2  11 29 17    0.30 0.31if para1.startswith("http"):# 根据链接下载图片,并转换为opencv格式img1 = getImageByUrl(para1)img1 = cv2.cvtColor(np.asarray(img1), cv2.COLOR_RGB2BGR)img2 = getImageByUrl(para2)img2 = cv2.cvtColor(np.asarray(img2), cv2.COLOR_RGB2BGR)else:# 通过imread方法直接读取物理路径img1 = cv2.imread(para1)img2 = cv2.imread(para2)hash1 = aHash(img1)hash2 = aHash(img2)n1 = cmpHash(hash1, hash2)print('均值哈希算法相似度aHash:', n1)hash1 = dHash(img1)hash2 = dHash(img2)n2 = cmpHash(hash1, hash2)print('差值哈希算法相似度dHash:', n2)hash1 = pHash(img1)hash2 = pHash(img2)n3 = cmpHash(hash1, hash2)print('感知哈希算法相似度pHash:', n3)n4 = classify_hist_with_split(img1, img2)print('三直方图算法相似度:', n4)n5 = calculate(img1, img2)print("单通道的直方图", n5)print("%d %d %d %.2f %.2f " % (n1, n2, n3, round(n4[0], 2), n5[0]))print("%.2f %.2f %.2f %.2f %.2f " % (1-float(n1/64), 1 -float(n2/64), 1-float(n3/64), round(n4[0], 2), n5[0]))plt.subplot(121)plt.imshow(Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)))plt.subplot(122)plt.imshow(Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)))plt.show()if __name__ == "__main__":p1="https://ww3.sinaimg.cn/bmiddle/007INInDly1g336j2zziwj30su0g848w.jpg"p2="https://ww2.sinaimg.cn/bmiddle/007INInDly1g336j10d32j30vd0hnam6.jpg"runAllImageSimilaryFun(p1,p2)

3.直方图计算图片的相似度

利用直方图计算图片的相似度时,是按照颜色的全局分布情况来看待的,无法对局部的色彩进行分析,同一张图片如果转化成为灰度图时,在计算其直方图时差距就更大了。对于灰度图可以将图片进行等分,然后在计算图片的相似度。

# 将图片转化为RGB
def make_regalur_image(img, size=(64, 64)):gray_image = img.resize(size).convert('RGB')return gray_image# 计算直方图
def hist_similar(lh, rh):assert len(lh) == len(rh)hist = sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) for l, r in zip(lh, rh)) / len(lh)return hist# 计算相似度
def calc_similar(li, ri):calc_sim = hist_similar(li.histogram(), ri.histogram())return calc_simif __name__ == '__main__':image1 = Image.open('123.jpg')image1 = make_regalur_image(image1)image2 = Image.open('456.jpg')image2 = make_regalur_image(image2)print("图片间的相似度为", calc_similar(image1, image2))

4.SSIM(结构相似度度量)计算图片的相似度

SSIM是一种全参考的图像质量评价指标,分别从亮度、对比度、结构三个方面度量图像相似性。SSIM取值范围[0, 1],值越大,表示图像失真越小。在实际应用中,可以利用滑动窗将图像分块,令分块总数为N,考虑到窗口形状对分块的影响,采用高斯加权计算每一窗口的均值、方差以及协方差,然后计算对应块的结构相似度SSIM,最后将平均值作为两图像的结构相似性度量,即平均结构相似性SSIM。

# -*- coding: utf-8 -*-
from skimage.measure import compare_ssim
from scipy.misc import imread
import numpy as np
# 读取图片
img1 = imread('../dataset/100002.png')
img2 = imread('../dataset/100001.png')
img2 = np.resize(img2, (img1.shape[0], img1.shape[1], img1.shape[2]))
print(img1.shape)
print(img2.shape)
ssim =  compare_ssim(img1, img2, multichannel = True)
print(ssim)

5.基于互信息(Mutual Information)计算图片的相似度

通过计算两个图片的互信息来表征他们之间的相似度,如果两张图片尺寸相同,还是能在一定程度上表征两张图片的相似性的。但是,大部分情况下图片的尺寸不相同,如果把两张图片尺寸调成相同的话,又会让原来很多的信息丢失,所以很难把握。经过实际验证,此种方法的确很难把握。

from sklearn import metrics as mr
from scipy.misc import imread
import numpy as npimg1 = imread('1.jpg')
img2 = imread('2.jpg')img2 = np.resize(img2, (img1.shape[0], img1.shape[1], img1.shape[2]))img1 = np.reshape(img1, -1)
img2 = np.reshape(img2, -1)
print(img2.shape)
print(img1.shape)
mutual_infor = mr.mutual_info_score(img1, img2)print(mutual_infor)

参考来源:

1.https://cloud.tencent.com/developer/article/1475424

2.https://blog.csdn.net/weixin_39121325/article/details/84187453

3.https://blog.csdn.net/enter89/article/details/90293971

http://www.lbrq.cn/news/1434835.html

相关文章:

  • java网站建设教程/网站流量统计工具
  • 做企业网站联系/深圳百度推广代理商
  • 兰州网站/网络推广的工作内容
  • 北京手机网站建设公司/百度推广收费标准
  • 百度站长工具网站认证/谷歌seo搜索优化
  • 班级网站的建设调查表/培训机构网站
  • java 做的网站/a5站长网
  • 用摄像头直播网站怎么做/实体店怎么引流推广
  • 手工做的网站/自助建站系统个人网站
  • 用什么开源框架做网站/狼雨seo网站
  • 深圳住房与建设局网站/东莞软文推广
  • 宜昌做网站哪家最便宜/seo关键词排名系统
  • 做交互网站/建网站seo
  • 做网站应该注意哪些问题/免费行情网站
  • 电子商务网站设计与制作/今日头条热搜榜前十名
  • 最简单的做网站/百度开户需要什么条件
  • 奇迹网站自己做/对seo的认识和理解
  • 做安居客网站需要什么浏览器/seo技术经理
  • 网站如何进行优化/企业网站推广效果指标分析
  • 百科网站建设/某个网站seo分析实例
  • 做微博网站/长沙seo咨询
  • 网站的版式设计有哪些/整合营销包括哪三方面
  • 公司网站打不开不知道谁做的/快照关键词优化
  • 如何做淘宝商城网站/好的推广平台
  • 永康做网站的公司/福州网站建设
  • 盘锦做网站的公司/广州网络推广平台
  • 美女色情做视频网站有哪些/黄页引流推广
  • 网站做成app/下载官方正版百度
  • 揭阳建网站/万能推广app
  • 如何提高网站的搜索/东莞免费网站建设网络营销
  • Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
  • 嵌入式第二十七天(UI相关技术(framebuffer))
  • 15.卷积神经网络
  • 使用 6 种方法将文件从 Android 无缝传输到iPad
  • 机械臂的智能升维:当传统机械臂遇见Deepoc具身智能大模型从自动化工具到具身智能体的范式革命
  • 《算法导论》第 18 章 - B 树