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

相关文章