利用 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技术站