关于python:图像相似度对比

49次阅读

共计 2671 个字符,预计需要花费 7 分钟才能阅读完成。

【申明】度量两张图片的类似度有许多算法,本文将对罕用的图片类似度算法进行汇总。局部数据、材料来源于各技术网站,如有侵权烦请分割删除。
罕用的算法有几类:

一、Hash 算法

  • Hash 算法罕用的有三种,别离为均匀哈希算法 (aHash)、感知哈希算法你(pHash) 和差别哈哈希算法(dHash);还有一种是小波哈希算法(whash)。
  • Hash 算法都是通过获取图片的 hash 值,再比拟两张图片 hash 值的汉明间隔来度量两张图片是否类似。两张图片越类似,那么两张图片的 hash 数的汉明间隔越小。

1、aHash- 均匀哈希

算法步骤

均匀哈希算法是三种 Hash 算法中最简略的一种,它通过上面几个步骤来取得图片的 Hash 值:

(1) 缩放图片;
(2) 转灰度图; 
(3) 算像素均值;
(4) 依据类似均值计算指纹.


失去图片的 ahash 值后,比拟两张图片 ahash 值的汉明间隔,通常认为汉明间隔小于 10 的一组图片为类似图片。

举栗

咱们以一张动物的图片为例,详解 ahash 算法过程:
原图:

缩放图片
先将图片缩放为 8 * 8 的图片,失去下图:

图片灰度
失去灰度图:

失去单通道灰度图的各个像素值

计算平均值
求得的平均值为 152.4375

每个像素点与平均值比拟

那么该图片的 ahash 值即为:1111100011110000111111001111011011100111111011101111000000001000

ahash 代码

import cv2
import numpy as np
import copy


def ahash_process(pic_path):
    '''
    ahash 算法过程
    :param pic_path: 图片门路
    :return: 
    '''
    img = cv2.imread(pic_path, cv2.IMREAD_UNCHANGED)
    img_resize = cv2.resize(img, (8, 8), cv2.INTER_AREA)
    gray_img = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)
    print('单通道灰度图:', gray_img)

    avg = np.mean(gray_img)
    print('平均值:', avg)

    dis = copy.deepcopy(gray_img)
    dis_hash_str = ''
    for x_index, x in enumerate(gray_img):
        for y_index, y in enumerate(x):
            if y >= avg:
                dis[x_index, y_index] = 1
            else:
                dis[x_index, y_index] = 0
            dis_hash_str += str(dis[x_index, y_index])
    print('与平均值比拟:', dis)
    print('该图片的 ahash 值:', dis_hash_str)

    cv2.namedWindow('resize', 0)
    cv2.resizeWindow('resize', 600, 600)
    cv2.imshow('resize', img_resize)

    cv2.namedWindow('gray', 0)
    cv2.resizeWindow('gray', 600, 600)
    cv2.imshow('gray', gray_img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

两张图片比照天然须要另外一张图片,同理通过上述办法,计算出 hash 值后,计算汉明间隔即可。

2、dHash- 差别哈希

算法步骤

dhash 和 ahash 算法的差异在于,ahash 应用每个像素点与均匀像素做比照得出布尔值,dhash 是应用以后像素与后一个像素点做比照失去布尔值,正是这个起因,所以 dhash 算法须要将图片缩放为 9 * 8 个像素点。

(1)图片缩放为 9 *8,保留构造,进来细节;(2)灰度化:转换为 256 阶灰度图;(3)求平均值:计算灰度图所有像素的平均值;(4)比拟:像素值大于后一个像素值记作 1,相同记作 0。本行不与下一行比照,每行 9 个像素,八个差值,有 8 行,总共 64 位;(5)生成 hash:将上述步骤生成的 1 和 0 按程序组合起来既是图片的指纹(hash);

举栗

原图:

缩放图片
先将图片缩放为 9 * 8 的图片,失去下图:

图片灰度
失去灰度图:

失去单通道灰度图的各个像素值

每个像素点与前面一个像素点比拟值

那么该图片的 dhash 值即为:0011011010111011010110101111001011010011101110011110101111001101

dHash 代码

import cv2


def dhash_process(pic_path):
    img = cv2.imread(pic_path, cv2.IMREAD_UNCHANGED)
    img_resize = cv2.resize(img, (9, 8), cv2.INTER_AREA)
    gray_img = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)
    print('单通道灰度图:', gray_img)

    dis = [[] for x in range(8)]
    dis_hash_str = ''
    for row in range(8):
        for col in range(8):
            if gray_img[row, col] >= gray_img[row, col + 1]:
                dis[row].append(1)
                dis_hash_str += str(1)
            else:
                dis[row].append(0)
                dis_hash_str += str(0)

    print('比拟值:', dis)
    print('该图片的 dhash 值:', dis_hash_str)

    cv2.namedWindow('resize', 0)
    cv2.resizeWindow('resize', 600, 600)
    cv2.imshow('resize', img_resize)

    cv2.namedWindow('gray', 0)
    cv2.resizeWindow('gray', 600, 600)
    cv2.imshow('gray', gray_img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

二、SSIM 算法

SSIM(构造相似性度量),这是一种全参考的图像品质评估指标,别离从亮度、对比度、构造三个方面度量图像相似性。

参考文章:

https://cloud.tencent.com/dev…
https://www.cnblogs.com/Kalaf…
https://blog.csdn.net/u010977…

正文完
 0