简介

由于项目需要对比两张相同图片的相似度,因此采用opencv将图片转为灰阶数组,然后对比相应的数组来取相似度,此方法只适用于大小相同的图片,较为局限

# -*- coding: utf-8 -*-
import cv2
import os
# scikit-image
from skimage.metrics import structural_similarity as ssim class PictureSimilarity():
"""
Image cutting and image recognition
Parameters:
origin_img: 起始图片
compare_img: 需要对比的图片
start_x: 裁切的起始x轴
start_y: 裁切的起始y轴
end_x: 裁切的末尾x轴
end_y: 裁切的末尾y轴
"""
def __init__(self, origin_img, compare_img, start_y=None, end_y=None, start_x=None, end_x=None):
self.origin_img = origin_img[0]
self.compare_img = compare_img[0]
self.start_x = start_x
self.start_y = start_y
self.end_x = end_x
self.end_y = end_y def compute_Similarity(self):
try:
print(f"compute acquaintance")
image1 = cv2.imread(self.origin_img)
image2 = cv2.imread(self.compare_img)
if self.start_x is not None:
image1 = image1[int(self.start_y):int(self.end_y), int(self.start_x):int(self.end_x)]
cut_img = "{}_cut.png".format(os.path.splitext(self.origin_img)[0])
cv2.imwrite(cut_img, image1)
else:
image1 = image1
height1, wide1 = image1.shape[0:2]
if not height1 or not wide1:
print("Picture coordinate error, screenshot size cannot be zero")
if image1.shape != image2.shape:
print("Inconsistent picture size")
# 会强制拉伸图片
image2 = cv2.resize(image2, (image1.shape[1],image1.shape[0]))
resize_img = "{}_resize.png".format(os.path.splitext(self.compare_img)[0])
cv2.imwrite(resize_img, image2)
image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
acquaintance = ssim(image1, image2)
acquaintance = acquaintance*100
acquaintance = round(acquaintance, 2)
print(f"acquaintance is {acquaintance}")
return acquaintance
except Exception as e:
print(f"compute_Similarity error is {str(e)}") def compute_img(self):
Similarity = None
try:
print(f"start compute acquaintance")
print(self.origin_img)
if os.path.exists(self.origin_img) and os.path.exists(self.compare_img):
Similarity = self.compute_Similarity()
else:
print("content not exist")
except Exception as e:
print(f"compute_img error is {str(e)}")
finally:
return Similarity if __name__ == "__main__":
image_path1 = "/home/ts/workspace/image2_2.png",
image_path2 = "/home/ts/workspace/image2.png",
test = PictureSimilarity(image_path1, image_path2, 12,189,23,400)
result = test.compute_img()
print(result)

python opencv图像识别(相同大小图片)的更多相关文章

  1. OpenCV实现任意大小图片的合并(转)

    OpenCV实现图像合并主要有两种方法 方法一:使用Mat.push_back方法将列数相同的图像加到最后一行 方法二: 主要思路是将图像拷贝到待合并图像的感兴趣区域 (1)新建一个要合并的图像(容器 ...

  2. Python+opencv图像识别

    图像识别 最近工作遇到了一个需要识别安全键盘并点击的需求,做自动化嘛,由于安全键盘的键位固定但是键值随机,所以常规的方法不能正确获取触发点击,so,上网查了一下基本思路都是用机器识别. 加载openc ...

  3. Python+Opencv进行识别相似图片

    http://blog.csdn.net/feimengjuan/article/details/51279629

  4. python opencv show图片,debug技巧

    debug的时候可以直接把图片画出来debug. imshow函数就是python opencv的展示图片的函数,第一个是你要起的图片名,第二个是图片本身.waitKey函数是用来展示图片多久的,默认 ...

  5. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  6. Python + opencv 实现图片文字的分割

    实现步骤: 1.通过水平投影对图形进行水平分割,获取每一行的图像: 2.通过垂直投影对分割的每一行图像进行垂直分割,最终确定每一个字符的坐标位置,分割出每一个字符: 先简单介绍一下投影法:分别在水平和 ...

  7. Python OpenCV图片转视频 工具贴(三)

    Python OpenCV图片转视频 粘贴即用,注意使用时最好把自己的文件按照数字顺序命名.按照引导输入操作. # 一键傻瓜式引导图片串成视频 # 注意使用前最好把文件命名为数字顺序格式 import ...

  8. python中用opencv读取并显示图片

    一.读取并显示图片: import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读 ...

  9. Python+OpenCV图像处理(一)

    Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...

随机推荐

  1. Jmeter接口测试流程详解(中科软测认证中心)

    1.jmeter简介 Jmeter是由Apache公司开发的java开源项目,所以想要使用它必须基于java环境才可以: Jmeter采用多线程,允许通过多个线程并发取样或通过独立的线程对不同的功能同 ...

  2. if判断+while循环

    1.常量​ ​纯大写字母命名常量名,如:AGE_OF_OLDBOY=18 常量的值是可以改变的,如:AGE_OF_OLDBOY=19 2.基本运算符 (1).算术运算​ +.-.*./​ ​      ...

  3. spring boot redis 写入异常

    redis 的 key value 使用 json 序列化.反序列化时,写入的 bean 不能是 final 类型的类,否则无法解析

  4. MySQL体系结构与数据类型

    layout: post title: "MySQL体系结构与数据类型" date: 2018-02-26 categories: MySQL tags: MySQL 一.MySQ ...

  5. MyBatis 结果映射总结

    前言 结果映射指的是将数据表中的字段与实体类中的属性关联起来,这样 MyBatis 就可以根据查询到的数据来填充实体对象的属性,帮助我们完成赋值操作.其实 MyBatis 的官方文档对映射规则的讲解还 ...

  6. JAVA - 线程同步和线程调度的相关方法

    JAVA - 线程同步和线程调度的相关方法 wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁:wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等 ...

  7. 支持向量机SVM(一):基本概念、目标函数的推导

    本文旨在介绍支持向量机(SVM)的基本概念并解释SVM中的一个关键问题: 为什么SVM目标函数中的函数间隔取1? 一.分类问题 给定N个分属两类的样本,给出一个决策边界使得边界一侧只含一种样本(如下图 ...

  8. Java集合框架(四)-HashMap

    1.HashMap特点 存放的元素都是键值对(key-value),key是唯一的,value是可以重复的 存放的元素也不保证添加的顺序,即是无序的 存放的元素的键可以为null,但是只能有一个key ...

  9. BUUCTF-RAR

    rar 看提示知道爆破压缩包的题,纯数字4位数拿出ARCHPR爆破即可.

  10. fiddle如何使用代理

    前言 Fiddle作为抓包工具深受程序员的喜爱,可能在代理方面有些会感觉到迷惑的,可以通过本文的学习来掌握一些基本的知识. Fiddle介绍 Fiddler是位于客户端和服务器端的HTTP代理,也是目 ...