栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

图像特征处理_基于图像相似性的分割技术?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

图像特征处理_基于图像相似性的分割技术?

图像处理:利用相似度处理相似度较大的图像

import sys
import os
import cv2

def aHash(img):
    # 均值哈希算法
    # 缩放为8*8
    img = cv2.resize(img, (8, 8))
    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # s为像素和初值为0,hash_str为hash值初值为''
    s = 0
    hash_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_str

def 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 + 1
    return n

def 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.31


    # 通过imread方法直接读取物理路径
    img1 = cv2.imread(para1)
    img2 = cv2.imread(para2)

    hash1 = aHash(img1)
    hash2 = aHash(img2)
    n1 = cmpHash(hash1, hash2)
    # print('均值哈希算法相似度aHash:', n1)
    return n1





THRE_VALUE=35   # 相似度阈值
def sort_image():
    # 图像需要保存的目录
    aime_path=r"D:PycharmProjectstemp_fileaim_image"
    # 原始图像目录
    origin_path=r"D:PycharmProjectstemp_filesave_images"
    aim_files = os.listdir(aime_path)


    # 原始图像名称列表
    ori_num_name=[]

    # 需要备份的图像文件名称
    aime_num_name=[]

    origin_files = os.listdir(origin_path)
    for ori_file in origin_files:
        file_ = os.path.splitext(ori_file)[0]
        ori_num_name.append(int(file_))

    ori_num_name = sorted(ori_num_name)        # 按照顺序由小到大进行排序

    while ori_num_name:
        name_pop = ori_num_name.pop(0)

        # 判断需要备份的图像名称列表是否为空,为空,则添加作为第一个,否则进行图像相似度比较
        if len(aime_num_name)==0:
            aime_num_name.append(str(name_pop)+".jpg")
        else:
            # 进行比较,如果相似度大于阈值,则添加进aime_num_name中
            ori_path = os.path.join(origin_path, str(name_pop) + ".jpg")

            previous_path = os.path.join(origin_path, aime_num_name[-1])

            # 进行哈希比较,得到两幅图像的相似度
            hash_value=runAllImageSimilaryFun(ori_path,previous_path)
            print(hash_value)

            if hash_value>30:
                aime_num_name.append(str(name_pop)+".jpg")

    print(aime_num_name)

if __name__ == '__main__':
    sort_image()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783356.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号