一.使用PIL(pillow)模块进行图片对比:
1.1安装PIL模块
pip install pillow
1.2示例代码
将两张图片转换为灰度图像,并计算它们之间的差异;然后,计算差异的统计信息并输出平均差异值。如果两张图片完全相同,则平均差异值为0;如果完全不同,则平均差异值将接近255。
#导入需要使用的模块 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')
#显示图片
pic1_gray.show() #计算两张图片的差异,返回每个像素的差异 diff = ImageChops.difference(pic1_gray,pic2_gray) #统计差异的统计信息,计算整个图像或图像的部分区域的统计数据 stat = ImageStat.Stat(diff) #输出差异的平均值,值越大差异越大 print(stat.mean[0])
输出:
39.72462890625
ImageStat.Stat:函数可以接受一个图像或一个掩码作为输入,并返回一个包含统计信息的实例。如果输入是图像,函数将计算整个图像的统计数据。如果输入是掩码,函数将仅针对掩码所定义的区域进行统计。
ImageStat.Stat函数提供了一些属性来访问计算出的统计信息,例如mean(平均值)、median(中位数)、mode(众数)和std(标准差)等。此外,该函数还提供了extrema属性,用于获取图像中每个通道的最大值和最小值。
二.使用CV2(pillow)模块进行图片对比:
2.1安装CV2(opencv)模块
pip install opencv-python
2.2示例代码
#读取完整图片,如果通道缺失则会报错 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)
输出:
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
标签:函数,Python,归一化,cv2,直方图,图像,对比,NORM,图片 From: https://www.cnblogs.com/qq771293871/p/17864982.html