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 通道。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律