python照片比对:如何比较两个图像并突出显示差异?

2021年11月7日19:10:49 发表评论 2,430 次浏览

OpenCV是一个功能强大且高度优化的开源库,在 BSD 3-clause 许可下开发和发布。它可用于跨平台(Linux、macOS、ios、windows 和 android)并支持多种语言(C++、Java 和 python),用途广泛。它是使用 Python 比较两个图像并突出显示差异的最佳方法之一,那么python如何实现照片比对

python照片比对:它是为机器学习、图像处理、3D 重建、对象检测等而开发的,但现在它在实时应用中发挥着重要作用,这在这个时代非常重要,它的实时操作可以处理图像和视频,识别物体,甚至它可以区分手写或两个非常相似的图像。OpenCV 应用程序仅受我们想象力的限制。

python如何比较两个图像?在本文中,我们将使用 OpenCV 包并使用它来比较两个图像并使用 Python 突出显示差异。

例如,让我们来看看这两个网页截图:

python照片比对:如何比较两个图像并突出显示差异?
1.png
python照片比对:如何比较两个图像并突出显示差异?
2.png

在第一张图片中,我们有 3 篇文章,在第二张图片中,我们有 6 篇文章。我们将使用 OpenCV 突出显示并找出这两个屏幕截图之间的区别。现在我们假设我们在系统内存的某个地方有两个这样的网页截图。

我们必须牢记两个基本要素:

  1. 两个图像必须具有相同的大小和通道。
  2. 每个像素必须是相同的值。

我们可以通过以下七个步骤来完成:

  • 加载原始图像和第二张
  • 检查图像的大小  
  • 找出两张图片之间的不同之处
  • 将它们转换为灰度
  • 增加差异的大小
  • 查找更改的计数器
  • 在更改周围显示框

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如何比较两个图像?在第一个语法中,我们遍历在图像中找到的所有轮廓,我们可以尝试找到相同图像的矩形绿色边界框。在语法的第三行,我们必须在绿色边界框上制作绿色矩形,最后,我们可以在语法的最后一行将图像保存在磁盘上。这些绿色矩形框将帮助你使用 Python 比较两个图像并突出显示差异。容易吧?从GITHUB克隆

python照片比对总结

因此,这就是你可以使用 Python 比较两个图像并突出显示差异的方法。如果你们对此有任何问题/意见,请告诉我们。比较只是图像处理领域的第一步,你可以使用 OpenCV 实现更多目标。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: