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

yizhihongxing

利用 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日

相关文章

  • 详解Python PIL ImageOps.solarize()方法

    Python PIL库提供了ImageOps模块,该模块提供了许多有用的图像操作函数,包括ImageOps.solarize()方法。该方法提供了一种将图像中像素值小于threshold的像素反转颜色的功能,也就是说将图像中像素的颜色由[0, threshold)映射到(threshold, 255]区间,从而使图像产生“solarize(日晒)”效果。 方…

    python-answer 2023年3月25日
    00
  • Python基于Serializer实现字段验证及序列化

    Python基于Serializer实现字段验证及序列化,是在使用Django等Python Web框架开发应用时使用频率非常高的技术之一。它通过预定义的Serializer类,将输入的数据验证、序列化为符合要求的Python对象。下面详细讲解一下使用Python基于Serializer实现字段验证及序列化的完整攻略。 1. 引入Serializer 在Py…

    python 2023年6月2日
    00
  • Python+matplotlib实现简单曲线的绘制

    关于“Python+matplotlib实现简单曲线的绘制” 的完整攻略,我将介绍以下几个方面: 准备环境及安装 matplotlib 模块 在 Python2/3 环境中,通过 pip 工具安装 matplotlib 模块: pip install matplotlib 编写代码 绘制简单的折线图,需要确定横轴和纵轴的数据。下面的示例使用 numpy 模块…

    python 2023年5月19日
    00
  • python基于watchdog库全自动化监控目录文件

    下面是详细讲解”python基于watchdog库全自动化监控目录文件”的完整攻略。 什么是watchdog库 watchdog库是一个Python库,它可以监视文件系统中的任何目录变化,并根据您的需要执行操作。它支持文件和目录的监控,并通过轮询文件系统来检查更改。可以通过在此基础上构建项目来轻松实现全自动化监控。 安装watchdog库 请先确保已按照所需…

    python 2023年6月5日
    00
  • 基于Python和Scikit-Learn的机器学习探索

    基于Python和Scikit-Learn的机器学习探索 介绍 本文将详细讲解如何使用Python和Scikit-Learn进行机器学习探索。机器学习是一种利用计算机训练模型,从而实现自主学习、理解和处理新数据的方法。Python是一种简单易用的编程语言,并且拥有强大的科学计算和数据处理功能。Scikit-Learn是Python中最流行的机器学习库之一,它…

    python 2023年6月6日
    00
  • Python爬虫入门教程02之笔趣阁小说爬取

    下面是“Python爬虫入门教程02之笔趣阁小说爬取”的详细攻略。 一、准备工作 在开始爬取笔趣阁小说之前,需要安装相关的Python库。常用的爬虫库有requests、beautifulsoup4、re等。 使用pip命令安装: pip install requests pip install beautifulsoup4 pip install re 安…

    python 2023年5月14日
    00
  • python使用MQTT给硬件传输图片的实现方法

    Python 使用 MQTT 给硬件传输图片的实现方法 MQTT 是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在 Python 中,可以使用 paho-mqtt 库来实现 MQTT 的功能。以下是 Python 使用 MQTT 给硬件传输图片的实现方法。 1. 安装 paho-mqtt 库 首先,我们需要安装 paho-mqtt 库。可以使用以下…

    python 2023年5月15日
    00
  • python2 对excel表格操作完整示例

    下面我将详细讲解 “Python2对Excel表格操作完整示例” 的实例教程。首先,需要使用 pip 安装 pandas 和 xlrd 这两个库,可以使用以下命令进行安装: pip install pandas pip install xlrd 接下来,我们就可以开始使用 pandas 和 xlrd 库对 Excel 表格进行操作了。我们先来看一个简单的示例…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部