利用OpenCV和Python实现查找图片差异

利用 OpenCV 和 Python 实现查找图片差异

简介

在实际工作中,我们经常需要对图片进行对比分析,例如查找两张图片之间的差异。 OpenCV 是一个功能强大,易于使用的图像处理工具包,可以在 Python 环境下使用。本文将讲解如何利用 OpenCV 和 Python 实现查找图片差异的完整攻略。

环境准备

在开始之前,请确保您有以下工具和包:

  • Python 3.x
  • OpenCV:您可以通过 pip 安装 OpenCV,命令为 pip install opencv-python
  • Numpy:您可以通过 pip 安装 Numpy,命令为 pip install numpy

第一步:加载图片

在 Python 中,您可以使用 OpenCV 的 imread() 函数来加载图片,该函数返回一个表示图像的矩阵(即 NumPy 数组),您可以在代码中使用该矩阵进行图像分析和处理。

import cv2

# 加载图片
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

第二步:转换图片

在进行图像分析时,您需要将其转换为灰度图像,这样可以降低计算成本并提高准确性。

# 将彩色图片转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

第三步:计算差异

使用 OpenCV 的 absdiff() 函数,可以快速计算出两张图片的差异。

# 计算两张灰度图像的差异
diff = cv2.absdiff(gray1, gray2)

第四步:应用阈值

计算出图片差异后,您需要将其应用一个阈值,这样可以使差异更加明显。

# 应用二值化阈值
threshold = 30 # 设置阈值
_, thresh = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY)

第五步:查找轮廓

使用 findContours() 函数查找阈值化的图像中的所有轮廓。

# 查找 灰度图像的轮廓
_, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

第六步:绘制轮廓

找到轮廓后,您可以使用 drawContours() 函数将其绘制到差异图像上。

# 在图片上绘制轮廓
cv2.drawContours(img1, contours, -1, (0, 0, 255), 2)
cv2.drawContours(img2, contours, -1, (0, 0, 255), 2)

示例一:查找两张图像的差异

以下代码将演示如何加载两张图片并查找两张图片之间的差异。

import cv2

# 加载图片
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 将彩色图片转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 计算两张灰度图像的差异
diff = cv2.absdiff(gray1, gray2)

# 应用二值化阈值
threshold = 30 # 设置阈值
_, thresh = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY)

# 查找灰度图像的轮廓
_, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 在图片上绘制轮廓
cv2.drawContours(img1, contours, -1, (0, 0, 255), 2)
cv2.drawContours(img2, contours, -1, (0, 0, 255), 2)

# 显示结果
cv2.imshow('Image 1', img1)
cv2.imshow('Image 2', img2)
cv2.imshow('Difference', diff)
cv2.imshow('Threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例二:查找网页截图中的差异

以下代码将演示如何加载两张网页截图并查找差异。

import cv2
import numpy as np
from PIL import ImageGrab

# 获取窗口截图
bbox = (0, 0, 1920, 1080) # 设置网页窗口的左上角坐标和右下角坐标
img1 = np.array(ImageGrab.grab(bbox))

# 打开新闻网页
import webbrowser
webbrowser.open('http://www.baidu.com')

# 等待网页加载完成
# 假设加载需要 5 秒
import time
time.sleep(5)

# 获取新闻网页截图
img2 = np.array(ImageGrab.grab(bbox))

# 将彩色图片转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 计算两张灰度图像的差异
diff = cv2.absdiff(gray1, gray2)

# 应用二值化阈值
threshold = 30 # 设置阈值
_, thresh = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY)

# 查找灰度图像的轮廓
_, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 在图片上绘制轮廓
cv2.drawContours(img1, contours, -1, (0, 0, 255), 2)
cv2.drawContours(img2, contours, -1, (0, 0, 255), 2)

# 显示结果
cv2.imshow('Window 1', img1)
cv2.imshow('Window 2', img2)
cv2.imshow('Difference', diff)
cv2.imshow('Threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

结论

利用 OpenCV 和 Python,您可以轻松地查找两张图片之间的差异。通过对差异图像的分析,您可以发现潜在的图像质量问题,从而使图像更加清晰和准确。除此之外,查找图片差异还可以应用于人工智能和机器学习领域,例如目标检测、图像识别等等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用OpenCV和Python实现查找图片差异 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python3.4学习笔记之列表、数组操作示例

    Python3.4学习笔记之列表、数组操作示例 在Python中,列表和数组是常用的数据结构之一,它们可以存储多个元素,并且可以动态地添加、删除、修改元素。本文将详细讲解Python中列表和数组的操作方法,并提供两个示例说明。 列表操作 创建列表 我们可以使用方括号([])或者list函数来创建一个列表。下面代码创建了一个包含三个元素的列表: my_list…

    python 2023年5月13日
    00
  • 开发 python wsgi 应用程序时 Apache 重启

    【问题标题】:Apache restart when developing python wsgi apps开发 python wsgi 应用程序时 Apache 重启 【发布时间】:2023-04-03 10:28:01 【问题描述】: 我正在评估用于 Web 开发的 python (mod_wsgi),并注意到在 Windows 上我必须在更改我的 py…

    Python开发 2023年4月8日
    00
  • Python 实现的 Google 批量翻译功能

    下面是Python实现的Google批量翻译功能的完整攻略。 一、实现的原理 Google翻译是一种使用人工智能算法的神经网络翻译模型,它可以将任何给定的词语或句子从一种语言翻译成另一种语言。我们可以使用Python程序调用Google翻译的API来实现批量翻译。 Python中有两个常用的库可以实现Google翻译的API调用,一个是googletrans…

    python 2023年6月5日
    00
  • python wordcloud库实例讲解使用方法

    Python WordCloud库使用方法 1. 什么是WordCloud库? WordCloud库是Python中一个用于生成词云图的工具,经常用于分析文本数据。 WordCloud库提供了多种可调参数,可以生成各种不同的词云图,如更改词云图的字体、颜色和形状等。 2. 安装WordCloud库 使用pip命令来安装WordCloud库: pip inst…

    python 2023年5月20日
    00
  • Python 实现向word(docx)中输出

    实现向Word(docx)中输出,需要使用Python中的三方库——python-docx,本文将给出完整的攻略。 准备工作 在开始之前,我们需要进行以下准备工作: 安装python-docx库 pip install python-docx 创建一个名为’demo.docx’的Word文档。这里我们可以手动创建一个空白的Word文档,并将它放置在py文件所…

    python 2023年6月5日
    00
  • Python利用re模块实现简易分词(tokenization)

    Python利用re模块实现简易分词(tokenization) 在自然语言处理中,分词是一个非常重要的任务。分词的目的是将一段文本分成若干个词语,以便后续的处理。在本文中,我们将介绍如何使用Python的re模块实现简易分词。 re模块简介 re模块是Python中用于正则表达式操作的模块。正则表达式是一种用于匹配字符串的模式,可以用于字符串的搜索、替换、…

    python 2023年5月14日
    00
  • python处理csv数据的方法

    下面详细讲解一下Python处理CSV数据的方法。 1. 什么是CSV CSV指的是逗号分隔值(Comma-Separated Values),是一种常见的数据存储格式。它使用逗号作为分隔符,用于在不同的应用程序之间交换数据。每一条数据分为若干列,列之间用逗号分隔,并且每一行表示一条记录。例如: Name,Gender,Age Tom,Male,26 Luc…

    python 2023年6月3日
    00
  • Python设计模式:根据参数返回不同对象的类

    【问题标题】:Python design pattern: class that returns different objects depending on parametersPython设计模式:根据参数返回不同对象的类 【发布时间】:2023-04-04 17:44:01 【问题描述】: 这个问题涉及 Python 中的设计模式,是针对软件设计人员的…

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部