首页 > 编程语言 >Python对比图片

Python对比图片

时间:2023-11-29 15:34:15浏览次数:43  
标签:函数 Python 归一化 cv2 直方图 图像 对比 NORM 图片

一.使用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

相关文章

  • Python使用多进程及代理ip爬取小说
    前言在爬虫的过程中,为了提高爬取速度,我们可以采用多进程、多线程、协程等方式。本文将介绍Python使用多进程进行爬取的方法,并结合代理IP爬取小说为例子,帮助读者了解如何使用Python多进程和代理IP来进行爬取,以提高爬取效率和规避反爬机制。一、使用多进程爬取小说多进程是一种并发编......
  • python条件
    条件if语句if条件1:语句1elif条件2:语句2else:语句3if-els推导式ifexpression例:defabs7(n):returnnif(n>=0)else-nmatch-case语句match变量:case1:语句1case2:语句2case3:语句3case_:类似于default语句4case后的内容可以用|隔开,如1|2|3代码风格......
  • VS code中python代码格式化配置
    VScode中python代码格式化配置settings.jsonVScode打开命令面板(快捷键ctrlshiftP)搜settings.json发现里面有好几个设置:用户设置、工作区设置、文件夹设置、默认设置。其中默认设置一般不动,另外三个设置则是作用域一层层缩小:用户下所有文件=>工作区文件=>文件夹文件,可以......
  • python task3
    python(三)条件if语句if-else语句推导式match...case语句match后的对象会依次与case后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_可以匹配一切case_:类似于C和Java中的default:,当其他case都无法匹配时,匹配这条,保证永远会匹配......
  • python连接数据库(连MySQL)
    Python操作和连接数据库原创 阳阳 Python小例子 2023-10-1109:20 发表于湖北在Python中,你可以使用不同的库来操作和连接数据库,最常用的是sqlite3、MySQLdb和psycopg2。使用sqlite3连接和操作SQLite数据库:import sqlite3# 连接数据库conn = sqlite3.connect('......
  • python "\r\n" 与 "\n" 与 "\r" 与 "\n\r" 的区别
    在Python中,这些是表示换行或回车的特殊字符序列。它们的区别在于它们在不同操作系统上的使用习惯。\n:表示换行符,通常用于Unix、Linux和类似系统中。\r:表示回车符,通常用于老式的MacOS系统。\r\n:表示回车后跟换行符,通常用于Windows系统。\n\r:这个组合在实践中不太常见,通常不被使......
  • 手机直播源码,js实现懒加载、vue实现图片懒加载指令
    手机直播源码,js实现懒加载、vue实现图片懒加载指令图片懒加载监听滚动条滚动事件,当视口的高度+滚动高度,大于图片所在位置举例顶部的偏移量时(也就是距离),加载图片资源 index.html<!DOCTYPEhtml><html> <head>  <metacharset="UTF-8">  <metaname="viewport"conte......
  • Java开发者的Python快速实战指南:探索向量数据库之文本搜索
    前言如果说Python是跟随我的步伐学习的话,我觉得我在日常开发方面已经没有太大的问题了。然而,由于我没有Python开发经验,我思考着应该写些什么内容。我回想起学习Java时的学习路线,直接操作数据库是其中一项重要内容,无论使用哪种编程语言,与数据库的交互都是不可避免的。然而,直接操作......
  • python开发之个微机器人的二次开发
    请求URL:http://域名地址/sendText请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是string登录实例标识wcId是string接收方群idcontent是string文本内容消息(@的微信昵称需要自己......
  • 【Python】包和模块的应用
    1、模块模块就是.py文件,一个python文件就是一个模块,可以使用import关键字将一个模块导入到另一个模块中使用。python模块搜索路径:当前目录PATHONPATH环境变量标准链接库目录,是Python按照标准模块的目录,是在安装Python时自动创建的目录可以通过sys.path变量查看当前模块搜......