如何在OpenCV Python中比较两张图片?

如何在OpenCV Python中比较两张图片?

为了比较两张图片,我们使用像素值的均方误差(MSE)。相似的图片将具有较小的均方差值。使用这种方法,我们可以比较高度、宽度和通道数相同的两张图片。

步骤

您可以使用以下步骤使用OpenCV比较两张图片 **** −

导入必要的库。在以下所有Python示例中,所需的Python库是 OpenCV 。确保您已经安装了它。

import cv2

使用 cv2.imread() 读取输入图像并将其转换为灰度图像。图像的高度、宽度和通道数必须相同。

img1 = cv2.imread('panda.png')
img2 = cv2.imread('panda1.png')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

定义一个函数来计算两张图片之间的均方误差。

def mse(img1, img2):
   h, w = img1.shape
   diff = cv2.subtract(img1, img2)
   err = np.sum(diff**2)
   mse = err/(float(h*w))
   return mse

计算图像之间的均方误差(匹配误差)。

error = mse(img1, img2)

打印图像匹配误差(mse)并显示图像差异。

print("两张图片之间的图像匹配误差:", mse)
cv2.imshow("轮廓", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果值,即图像形状匹配度量。该值越低,匹配度越好。

print("匹配图片1和图片2:", ret12)

让我们看看一些示例,以更好地理解。

在下面的例子中,我们将使用以下图像作为 输入文件

如何在OpenCV Python中比较两张图片?

如何在OpenCV Python中比较两张图片?

如何在OpenCV Python中比较两张图片?

示例1

在此示例中,我们创建一个简单的四层人工神经网络,没有前向函数。

# 导入所需库
import cv2
import numpy as np

# 加载输入图片
img1 = cv2.imread('panda.jpg')
img2 = cv2.imread('panda1.jpg')

# 将图片转换为灰度图
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 定义函数来计算两张图片之间的MSE
def mse(img1, img2):
   h, w = img1.shape
   diff = cv2.subtract(img1, img2)
   err = np.sum(diff**2)
   mse = err/(float(h*w))
   return mse, diff

# 计算三幅图片之间的MSE误差
error1, diff1 = mse(img1, img2)
error2, diff2 = mse(img2, img3)
error3, diff3 = mse(img1, img3)

# 输出MSE误差值
print("Image matching Error between the two images:",error1,error2,error3)

# 展示三幅图片间的区别
cv2.imshow("difference between image 1 and 2", diff1)
cv2.imshow("difference between image 2 and 3", diff2)
cv2.imshow("difference between image 1 and 3", diff3)

cv2.waitKey(0)
cv2.destroyAllWindows()

输出

运行后,将在控制台中出现以下输出 −

Image matching Error between the two images: 3.0696934396076028 12.269405051889547 11.355810344827589

我们得到如下窗口,显示三张图片之间的差异 −

如何在OpenCV Python中比较两张图片?

例子2

在这个Python程序中,我们比较了三张图片。

导入 cv2
导入 numpy 作为 np
导入 matplotlib.pyplot 作为 plt

img1 = cv2.imread('panda.jpg')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
h, w = img1.shape

img2 = cv2.imread('panda1.jpg')
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
img3 = cv2.imread('bike.jpg')
img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)

def error(img1, img2):
   diff = cv2.subtract(img1, img2)
   err = np.sum(diff**2)
   mse = err/(float(h*w))
   msre = np.sqrt(mse)
   返回 mse, diff

match_error12, diff12 = error(img1, img2)
match_error13, diff13 = error(img1, img3)
match_error23, diff23 = error(img2, img3)

打印("图像1和图像2之间的匹配误差:",match_error12)
打印("图像1和图像3之间的匹配误差:",match_error13)
打印("图像2和图像3之间的匹配误差:",match_error23)

plt.subplot(221), plt.imshow(diff12,'gray'),plt.title("图像1 - 图像2"),plt.axis('关')
plt.subplot(222), plt.imshow(diff13,'gray'),plt.title("图像1 - 图像3"),plt.axis('关')
plt.subplot(223),plt.imshow(diff23,'gray'),plt.title("图像2 - 图像3"),plt.axis('关')
plt.show()

输出

当执行以上Python程序时,控制台将产生以下输出 −

图像1和图像2之间的匹配误差: 3.0696934396076028 
图像1和图像3之间的匹配误差: 23.37356529736358 
图像2和图像3之间的匹配误差: 24.15752299202943

我们会得到以下窗口,显示图片之间的差异 −

如何在OpenCV Python中比较两张图片?

请注意,图像1和图像2之间的匹配误差与图像1和3以及图像2和3之间的匹配误差相比较小。因此,图像1和图像2更为相似。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV