OpenCV是一个功能强大且高度优化的开源库,在 BSD 3-clause 许可下开发和发布。它可用于跨平台(Linux、macOS、ios、windows 和 android)并支持多种语言(C++、Java 和 python),用途广泛。它是使用 Python 比较两个图像并突出显示差异的最佳方法之一,那么python如何实现照片比对?
python照片比对:它是为机器学习、图像处理、3D 重建、对象检测等而开发的,但现在它在实时应用中发挥着重要作用,这在这个时代非常重要,它的实时操作可以处理图像和视频,识别物体,甚至它可以区分手写或两个非常相似的图像。OpenCV 应用程序仅受我们想象力的限制。
python如何比较两个图像?在本文中,我们将使用 OpenCV 包并使用它来比较两个图像并使用 Python 突出显示差异。
例如,让我们来看看这两个网页截图:
在第一张图片中,我们有 3 篇文章,在第二张图片中,我们有 6 篇文章。我们将使用 OpenCV 突出显示并找出这两个屏幕截图之间的区别。现在我们假设我们在系统内存的某个地方有两个这样的网页截图。
我们必须牢记两个基本要素:
- 两个图像必须具有相同的大小和通道。
- 每个像素必须是相同的值。
我们可以通过以下七个步骤来完成:
- 加载原始图像和第二张
- 检查图像的大小
- 找出两张图片之间的不同之处
- 将它们转换为灰度
- 增加差异的大小
- 查找更改的计数器
- 在更改周围显示框
python如何比较两个图像?程序实现
首先,我们将在系统或软件中加载我们将在此操作中使用的图像,你可以使用你喜欢的方式,网络上有很多 IDE,如 PyCharm、Microsoft Visual Studio 代码、Eclipse,等等。它们都很好,你可以使用其中的任何一种。你可以使用另一种编程语言来执行此操作,但在本教程中,我们将使用 Python,它是一种非常友好且初级的语言,大多数人开始使用这种语言学习编程,并且它有许多我们可以使用的库。
现在让我们开始这个python照片比对的过程:
让我们首先检查它们是否具有相同的大小和通道。如果两个图像具有相同的尺寸和通道,我们必须继续进行操作,如果两个图像没有相同的尺寸和通道,则它们不相等。
python如何实现照片比对?如果两个图像具有相同的大小和通道,我们可以通过减去它们来继续。操作 cv2.subtract(image1,image2) 而不是算术运算,只需将第一张图像中的每个像素减去第二张图像中相应像素的值。
现在让我们开始编码:
先决条件
- OpenCV 包
- Python知识
步骤 – 1:安装软件包
现在打开终端并使用以下命令安装所需的包:
python3 -m pip install imutils
python3 -m pip install opencv-python
第 2 步:导入依赖项
现在打开你最喜欢的代码编辑器并粘贴以下代码:
import cv2
import imutiimls
然后我们需要导入所需的库,包括 openCV 和 utils。我们可以imutils
使用“ pip install imutils
”命令轻松安装。
#get the images you want to compare.
original = cv2.imread("1.png")
new = cv2.imread("2.png")
#resize the images to make them small in size. A bigger size image may take a significant time
#more computing power and time
original = imutils.resize(original, height = 600)
new = imutils.resize(new, height = 600)
python如何比较两个图像?之后我们需要从系统内存中读取图像,我们需要确保两个图像与我们正在编写的代码放在同一文件夹中,否则你需要提供图像的位置路径。图像完全加载后,我们需要将图像大小调整为更易于管理的大小(在这种情况下为高 = 960 像素)。现在我们也可以处理原始图像本身,尽管有时图像的尺寸确实很大,因此处理图像可能需要更多的时间。
#create a copy of original image so that we can store the
#difference of 2 images in the same on
diff = original.copy()
cv2.absdiff(original, new, diff)
第 3 步:python照片比对 - 将图像转换为灰度
现在我们必须使用absdiff
有助于找到两个图像阵列像素之间绝对差异的函数。在这个函数的帮助下,我们将能够计算两个数组之间的每个元素的精确差异。差异在第三个参数中返回。
#converting the difference into grayscale images
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
#increasing the size of differences after that we can capture them all
for i in range(0, 3):
dilated = cv2.dilate(gray.copy(), None, iterations= i+ 1)
在这部分代码中,我们首先将图像转换为灰度,这有助于在图像上制作和应用不同类型的操作非常容易,然后我们应用形态学操作(形态学操作是一组广泛的图像处理操作,可以处理数字图像基于它们的形状和大小。)在图像上将像素合并在一起,因为我们对确切的差异并不真正感兴趣,但对图像上的差异区域真的很感兴趣。
#threshold the gray image to binary it. Anything pixel that has
#value higher than 3 we are converting to white
#(remember 0 is black and 255 is exact white)
#the image is called binarised as any value lower than 3 will be 0 and
# all of the values equal to and higher than 3 will be 255
(T, thresh) = cv2.threshold(dilated, 3, 255, cv2.THRESH_BINARY)
# now we have to find contours in the binarized image
cnts = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
python如何实现照片比对?在线五我们对膨胀的灰度图像进行阈值处理以将其二值化。任何值大于 3 的像素我们都将转换为白色(我们必须记住像素值 0 是黑色,255 是纯白色)并且该图像被称为二值化,因为任何低于 3 的值都将是 0 并且所有值类似于大于3的将转换为255。之后,我们可以使用OpenCV函数找到二值化图像的轮廓之一。
for c in cnts:
# nicely fiting a bounding box to the contour
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(new, (x, y), (x + w, y + h), (0, 255, 0), 2)
#remove comments from below 2 lines if you want to
#for viewing the image press any key to continue
#simply write the identified changes to the disk
cv2.imwrite("changes.png", new)
输出
python如何比较两个图像?在第一个语法中,我们遍历在图像中找到的所有轮廓,我们可以尝试找到相同图像的矩形绿色边界框。在语法的第三行,我们必须在绿色边界框上制作绿色矩形,最后,我们可以在语法的最后一行将图像保存在磁盘上。这些绿色矩形框将帮助你使用 Python 比较两个图像并突出显示差异。容易吧?从GITHUB克隆
python照片比对总结
因此,这就是你可以使用 Python 比较两个图像并突出显示差异的方法。如果你们对此有任何问题/意见,请告诉我们。比较只是图像处理领域的第一步,你可以使用 OpenCV 实现更多目标。