Python对比图片

一.使用PIL(pillow)模块进行图片对比:

1.1安装PIL模块

pip install pillow

1.2示例代码

将两张图片转换为灰度图像,并计算它们之间的差异;然后,计算差异的统计信息并输出平均差异值。如果两张图片完全相同,则平均差异值为0;如果完全不同,则平均差异值将接近255。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#导入需要使用的模块
from PIL import ImageChops, ImageStat,Image  
#打开需要对比的图片
pic1=Image.open("D:/autotest/11.png")     
pic2=Image.open("D:/autotest/22.png")
#将图片转换为灰度图像(彩色转黑白),该步可以跳过,直接对比获取的差异平均值要比转化后的高
pic1_gray =pic1.convert('L')
pic2_gray =pic2.convert('L')<br>#显示图片<br>pic1_gray.show()
#计算两张图片的差异,返回每个像素的差异
diff = ImageChops.difference(pic1_gray,pic2_gray)
#统计差异的统计信息,计算整个图像或图像的部分区域的统计数据
stat = ImageStat.Stat(diff)
#输出差异的平均值,值越大差异越大
print(stat.mean[0])<br><br>输出:<br>39.72462890625

ImageStat.Stat:函数可以接受一个图像或一个掩码作为输入,并返回一个包含统计信息的实例。如果输入是图像,函数将计算整个图像的统计数据。如果输入是掩码,函数将仅针对掩码所定义的区域进行统计。

ImageStat.Stat函数提供了一些属性来访问计算出的统计信息,例如mean(平均值)、median(中位数)、mode(众数)和std(标准差)等。此外,该函数还提供了extrema属性,用于获取图像中每个通道的最大值和最小值。

 二.使用CV2(pillow)模块进行图片对比:

2.1安装CV2(opencv)模块

pip install opencv-python

2.2示例代码

1
2
3
4
5
6
7
8
9
10
11
12
#读取完整图片,如果通道缺失则会报错
pic1=cv2.imread("D:/autotest/11.png",cv2.IMREAD_UNCHANGED)
pic2=cv2.imread("D:/autotest/22.png",cv2.IMREAD_UNCHANGED)
#计算img的直方图
H1=cv2.calcHist([pic1],[1],None,[256],[0,256])
H2=cv2.calcHist([pic2],[1],None,[256],[0,256])
#对图片进行归一化处理
H3=cv2.normalize(H1,H1,0,1,cv2.NORM_MINMAX,-1)
H4=cv2.normalize(H2,H2,0,1,cv2.NORM_MINMAX,-1)
#利用compareHist进行相似度比较
diff=cv2.compareHist(H3,H4,0)
print(diff)输出:<br>39.72462890625

2.3 cv2的calcHist函数

cv2.calcHist是OpenCV 库中的一个函数,用于计算图像的直方图。直方图是一种用于表示图像像素强度分布的图形,可以用于图像分析、特征提取等任务。基本语法如下:

    cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, dtype]])

  • images:输入图像数组,可以是彩色图像(多通道)或灰度图像(单通道)
  • channels:表示要计算直方图的通道数,如果是彩色图像,通常为 [0, 1, 2] 表示分别计算红、绿、蓝三个通道的直方图;如果是灰度图像,通常为 [0]
  • mask:掩膜图像,用于指定计算直方图的区域。如果不需要使用掩膜,则传递 None
  • histSize:表示直方图的尺寸,通常是一个包含两个元素的元组,表示直方图的行数和列数。
  • ranges:表示像素值的范围,通常是一个包含两个元素的元组,表示要计算的像素值的范围。例如,对于灰度图像,通常为 (0, 256)
  • hist:直方图数组的名称。如果指定了该参数,则函数将返回一个新创建的直方图数组;否则,将返回直方图数组的引用。
  • dtype:表示返回的直方图的类型。如果指定了该参数,则函数将返回指定类型的直方图;否则,将根据输入图像的类型自动选择合适的类型。

2.4cv2的normalize函数

 cv2.normalize 是 OpenCV 库中的一个函数,用于对图像进行归一化处理。归一化是图像处理中常用的预处理步骤之一,可以将图像的像素值范围调整到指定的范围,如 [0, 1] 或 [0, 255]。基本语法如下:

    cv2.normalize(src, dst, alpha=1.0, beta=0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

  • src:输入图像,可以是多通道图像(MxNxC)或单通道图像(MxN)。
  • dst:输出图像,与输入图像的大小和通道数相同。
  • alpha:缩放系数,归一化后的最小值,指定将像素值缩放到哪个范围,默认为 0。
  • beta:缩放系数,归一化后的最大值,,指定超出缩放范围时的像素值,默认为 1。
  • norm_type:归一化类型,默认为 cv2.NORM_MINMAX,表示将像素值缩放到 [0, 1] 范围。
    • cv2.NORM_INF: 最大规范化;
    • cv2.NORM_L1: 绝对值之和;
    • cv2.NORM_L2: 向增量平方和的平方根;
    • cv2.NORM_MINMAX: 最小和最大归一化;
    • cv2.NORM_RELATIVE: 相对规范化;
    • cv2.NORM_TYPE_MASK: 掩模类型;
    • cv2.NORM_DIFF: 差异;
  • dtype:输出图像的数据类型,默认为 cv2.CV_32F,表示输出图像为浮点型。

2.5cv2的compareHist函数

 cv2.compareHist 是 OpenCV 库中的一个函数,用于比较两个直方图。这个函数可以用来比较两个直方图的相似性,常用于图像识别和特征比较。函数返回一个浮点数,表示两个直方图的相似性程度。值越接近 1,表示两个直方图越相似;值越接近 0,表示两个直方图越不相似。基本语法如下:

    cv2.compareHist(hist1, hist2, method)

  • hist1:第一个直方图,通常是通过 cv2.calcHist 函数计算出来的。
  • hist2:第二个直方图,与第一个直方图具有相同的尺寸和类型。
  • method:比较直方图的方法,分别对应不同的相似性度量方式
    • cv::HISTCMP_CORREL = 0,
    • cv::HISTCMP_CHISQR = 1,
    • cv::HISTCMP_INTERSECT = 2,
    • cv::HISTCMP_BHATTACHARYYA = 3,
    • cv::HISTCMP_HELLINGER = HISTCMP_BHATTACHARYYA,
    • cv::HISTCMP_CHISQR_ALT = 4,
    • cv::HISTCMP_KL_DIV = 5  

 2.6cv2的imread函数

cv2.imread 是 OpenCV 库中的一个函数,用于读取图像文件。它可以将指定路径的图像文件读取为一个 NumPy 数组,这个数组可以表示一个彩色图像或灰度图像;如果读取不成功则返回None。基本语法如下:

    cv2.imread(path, flags=1)

  • path:要读取的图像文件的路径。
  • flags:可选参数,指定读取图像时的标志。默认全图。常用的标志有:
    • cv2.IMREAD_COLOR:读取图像为彩色图像,忽略 Alpha 通道。
    • cv2.IMREAD_GRAYSCALE:读取图像为灰度图像。
    • cv2.IMREAD_UNCHANGED:读取图像包括 Alpha 通道。

 

posted @   771293871  阅读(1446)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示