一个简单的人物图片相似对比程序

程序是参考了两部分的别人的代码,一个是找出照片中的人头,另一个是对两个人头照片做对比。

# -*- coding: utf-8 -*-
# feimengjuan
# 利用python实现多种方法来实现图像识别

import cv2
import numpy as np
from matplotlib import pyplot as plt, image

# 最简单的以灰度直方图作为相似比较的实现
def classify_gray_hist(image1, image2, size=(256, 256)):
    # 先计算直方图
    # 几个参数必须用方括号括起来
    # 这里直接用灰度图计算直方图,所以是使用第一个通道,
    # 也可以进行通道分离后,得到多个通道的直方图
    # bins 取为16
    image1 = cv2.resize(image1, size)
    image2 = cv2.resize(image2, size)
    hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
    hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
    # 可以比较下直方图
    plt.plot(range(256), hist1, ‘r‘)
    plt.plot(range(256), hist2, ‘b‘)
    plt.show()
    # 计算直方图的重合度
    degree = 0
    for 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 + 1
    degree = degree / len(hist1)
    return degree

# 计算单通道的直方图的相似值
def 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 = 0
    for 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 + 1
    degree = degree / len(hist1)
    return degree

# 通过得到每个通道的直方图来计算相似度
def classify_hist_with_split(image1, image2, size=(256, 256)):
    # 将图像resize后,分离为三个通道,再计算每个通道的相似值
    image1 = cv2.resize(image1, size)
    image2 = cv2.resize(image2, size)
    sub_image1 = cv2.split(image1)
    sub_image2 = cv2.split(image2)
    sub_data = 0
    for im1, im2 in zip(sub_image1, sub_image2):
        sub_data += calculate(im1, im2)
    sub_data = sub_data / 3
    return sub_data

# 平均哈希算法计算
def classify_aHash(image1, image2):
    image1 = cv2.resize(image1, (8, 8))
    image2 = cv2.resize(image2, (8, 8))
    gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
    hash1 = getHash(gray1)
    hash2 = getHash(gray2)
    return Hamming_distance(hash1, hash2)

def classify_pHash(image1, image2):
    image1 = cv2.resize(image1, (32, 32))
    image2 = cv2.resize(image2, (32, 32))
    gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
    # 将灰度图转为浮点型,再进行dct变换
    dct1 = cv2.dct(np.float32(gray1))
    dct2 = cv2.dct(np.float32(gray2))
    # 取左上角的8*8,这些代表图片的最低频率
    # 这个操作等价于c++中利用opencv实现的掩码操作
    # 在python中进行掩码操作,可以直接这样取出图像矩阵的某一部分
    dct1_roi = dct1[0:8, 0:8]
    dct2_roi = dct2[0:8, 0:8]
    hash1 = getHash(dct1_roi)
    hash2 = getHash(dct2_roi)
    return Hamming_distance(hash1, hash2)

# 输入灰度图,返回hash
def getHash(image):
    avreage = np.mean(image)
    hash = []
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            if image[i, j] > avreage:
                hash.append(1)
            else:
                hash.append(0)
    return hash

# 计算汉明距离
def Hamming_distance(hash1, hash2):
    num = 0
    for index in range(len(hash1)):
        if hash1[index] != hash2[index]:
            num += 1
    return num

if __name__ == ‘__main__‘:
    face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_alt2.xml‘)
    face_cascade.load(‘F:\pycharm\py2_7\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml‘)
    scaling_factor = 0.5
    img1 = cv2.imread(‘d://68.jpg‘)
    #img1 = cv2.resize(img1,(300,300))
    img1 = cv2.resize(img1, None, fx=scaling_factor * 3, fy=scaling_factor * 3, interpolation=cv2.INTER_AREA)
    gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    face_rects = face_cascade.detectMultiScale(gray, 1.1, 5)
    for (x, y, w, h) in face_rects:
        img1 = img1[y:y + h,x:x + w]
        #cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 255, 0), 3)

    img2 = cv2.imread(‘d://69.jpg‘)
    #img2 = cv2.resize(img2,(300,300))
    img2 = cv2.resize(img2, None, fx=scaling_factor * 3, fy=scaling_factor * 3, interpolation=cv2.INTER_AREA)
    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    face_rects2 = face_cascade.detectMultiScale(gray2, 1.1, 5)
    for (x, y, w, h) in face_rects2:
        img2 = img2[y:y + h,x:x + w]
        #cv2.rectangle(img2, (x, y), (x + w, y + h), (0, 255, 0), 3)
    #degree = classify_gray_hist(img1, img2)
    degree = classify_hist_with_split(img1,img2)
    #degree = classify_aHash(img1,img2)
    #degree = classify_pHash(img1,img2)
    out = format(‘相似度:%f‘ % (float)(degree*100))
    print out
    img1 = cv2.resize(img1, (300, 300))
    cv2.imshow(‘img1‘, img1)
    img2 = cv2.resize(img2, (300, 300))
    cv2.imshow(‘img2‘,img2)

    #degree = classify_hist_with_split(img1,img2)
    # degree = classify_aHash(img1,img2)
    # degree = classify_pHash(img1,img2)
    #print degree
    cv2.waitKey(0)

原文地址:https://www.cnblogs.com/ljy-1471914707/p/8451892.html

时间: 2024-08-30 14:20:54

一个简单的人物图片相似对比程序的相关文章

[软件测试学习]考虑到测试的代码编写/int.parse的非法输入—由一个简单的c#闰年检测程序说起

一个简单的C#的闰年检测程序 1.闰年检测的函数编写 当提起检测平年闰年时候,第一反应写出的代码 1 public static bool isLeapYear(int year){ 2 return ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)) 3 } 但是这个并不易于测试和出现错后的修改,更改代码如下 1 public static bool isLeapYear(int year){ 2 bool check = ne

Spring学习(二)——使用用Gradle构建一个简单的Spring MVC Web应用程序

1.新建一个Gradle工程(Project) 在新建工程窗口的左侧中选择 [Gradle],右侧保持默认选择,点击next,模块命名为VelocityDemo. 2.在该工程下新建一个 module,在弹出的窗口的左侧中选择 [Gradle],右侧勾选[Spring MVC],如下图所示: 并勾选[Application server],下方选择框中选择Tomcat7.0,如无该选项,则选中右边的 [ New... ] -- [ Tomcat Server ], 配置 Tomcat .配置好后

一个简单的计算分数的小程序

一个简单的计算分数的小程序 代码如下: package Day05; public class ExamGradeDemo { public static void main(String[] args) { char[][] answers = { {'C','B','D','C','A','A','D','C','D','C'}, {'A','C','B','D','C','A','D','C','B','D'}, {'A','C','B','D','B','D','C','A','A','

【jQuery插件分享】Cropper——一个简单方便的图片裁剪插件

原文:https://segmentfault.com/a/1190000012344970 插件介绍 这是一个我在写以前的项目的途中发现的一个国人写的jQuery图像裁剪插件,当时想实现用户资料的头像上传功能,并且能够预览图片,和对图片进行简单的裁剪.旋转,花了不少时间才看到了这个插件,感觉功能挺全面,代码实现起来也挺简单,再加上用的是Bootstrap,对移动端操作也有适配,于是就用了.现在稍微有点时间就记录一下,方便以后再用的时候查阅.另外也有对应的js版本. 官方文档(英文) jQuer

ffmpeg+sdl教程----编写一个简单的播放器4(让程序更模块化)

来源:http://blog.csdn.net/mu399/article/details/5815444 音频和视频之间的同步,再那之前需要先做一些准备工作. 为了让程序更模块化,便于扩展,需要把原来main函数中的各个功能模块代码分离出来放在相应的函数中.该教程和上个教程相比代码量和难度都增加很多,比上个教程使用了更多的线程,一定要理解清楚各个函数和数据结构之间的关联以及线程之间如何协同工作. [c-sharp] view plaincopy // ffmpegExe.cpp: 主项目文件.

用Python实现一个简单的——人脸相似度对比

近几年来,兴起了一股人工智能热潮,让人们见到了AI的能力和强大,比如图像识别,语音识别,机器翻译,无人驾驶等等.总体来说,AI的门槛还是比较高,不仅要学会使用框架实现,更重要的是,需要有一定的数学基础,如线性代数,矩阵,微积分等. 幸庆的是,国内外许多大神都已经给我们造好“轮子”,我们可以直接来使用某些模型.今天就和大家交流下如何实现一个简易版的人脸对比,非常有趣! 整体思路: 1.预先导入所需要的人脸识别模型: 2.遍历循环识别文件夹里面的图片,让模型“记住”人物的样子: 3.输入一张新的图像

用Objective-C写了一个简单的批量更改文件名的程序

前言:因为本人要高仿一个app,从app中解压asserts得到的所有图片文件,文件名都带有~iPhone这个干扰的名字,为了去除这个~iPhone这个字符串,所以本人写了个简答的批量更改所有文件名的程序. 程序员就是应该会利用程序来帮自己偷懒,因为用到的很多方法不是很熟悉,也是花了点时间去熟悉NSFileManager的一些方法,所以写下这个笔记做个笔记,省的下次又需要就忘记了方法. 我的基本需求,在啰嗦一下下哈: 一个文件目录下有上百个图片文件,文件名都带有~iPhone.写一个程序,删除所

go语言实现一个简单的登录注册web小程序

最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣.根据<go web编程>中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜: 这个例子使用到了beego框架和beedb框架,如果是go新手beego和beedb得自己去google下载安装. 目录结构: index.go package controllers import ( "fmt" "github.com/astaxie/beego"

OpenCV系列【2】,一个简单定标并储存结果的程序

基于张正友定标法的Opencv3.1定标程序,先用findchessboard找到棋盘,用cornersubpix做亚像素定位,再用calibrateCamera进行定标,最后将定标结果储存在xml文件里 程序基于vs2013和opencv3.1,要注意的是3.1根之前2XX系列很多地方不同,很多函数不同,具体情况看代码, 新手,难免犯诸如switch语句没有default之类的错误,大神看见请轻拍... /********************************************