Python 图像与参考图像的比较(像素基比较)

Python 图像与参考图像的比较(像素基比较),python,python-2.7,image-processing,Python,Python 2.7,Image Processing,标记资产区域(基于像素),使用参考图像进行图像分析,并查找缺失的资产 (像素基比较) 这仅用于扣除丢失的资产(如丢失的ups、对讲机、笔记本电脑) 我保留了一个主图像作为所有资产的模板。 无论何时发生诸如更换、丢失标记的项目等更改,都需要将丢失的项目标记为红色,并需要提醒管理员 我有一个python代码来进行图像比较,但无法根据我的要求进行自定义 ################### #ImageCompare.py# ################### #此模块包含用于快速和快速执

标记资产区域(基于像素),使用参考图像进行图像分析,并查找缺失的资产

(像素基比较)

这仅用于扣除丢失的资产(如丢失的ups、对讲机、笔记本电脑)

    我保留了一个主图像作为所有资产的模板。
  • 无论何时发生诸如更换、丢失标记的项目等更改,都需要将丢失的项目标记为红色,并需要提醒管理员
我有一个python代码来进行图像比较,但无法根据我的要求进行自定义

###################
#ImageCompare.py#
###################
#此模块包含用于快速和快速执行的方法
#轻松比较两幅图像,看看它们有多不同
#是的。这是为了用作
#有点像运动检测器。想法是
#如果图像
#被展示出来会有明显的变化。
#无法检测图像是否已更改
#通过两种方式实现:使用直方图
#比较(HistoCompare)和进行像素比较-
#通过像素比较。这是普遍发现的
#两幅不同图像的直方图
#通常情况下,它们与像素之间的差异更大-
#像素比较,但差异很小。
导入图像
#这是本模块最重要的功能
#事实上,它需要Python映像
#图书馆(PIL),以便使用。皮尔罐
#可在以下网址找到:
# http://www.pythonware.com/products/pil/index.htm
################
#组织比较#
################
#直方图比较采用两个直方图(生成
#使用PIL)以及可选字符串和
#可选双人房。柱状图如下所示
#要比较的图像的。
#如果您将“pct”作为模式传递,请进行比较
#将返回
#柱状图(从总的
#最有价值的直方图)。
#如果传入任何其他字符串作为模式,
#如果
#百分比差异小于alpha,并且
#否则就错了
def HistorCompare(im1,im2,mode=“pct”,alpha=.01):
如果im1.size==im2.size和im1.mode==im2.mode:
h1=im1.直方图()
h2=im2.直方图()
SumIm1=0.0
SumIm2=0.0
差异=0.0
对于范围内的i(len(h1)):
SumIm1+=h1[i]
SumIm2+=h2[i]
diff+=abs(h1[i]-h2[i])
最大总和=最大值(总和1,总和2)
如果模式==“pct”:
返回差/(2*maxSum)
如果差异>alpha*最大和:
返回错误
返回真值
返回错误
################
#像素比较#
################
#PixelCompare拍摄两幅单波段图像
#(使用PIL生成)以及可选的
#字符串和可选的双精度。
#如果将“pct”作为模式传递,则PixelCompare
#将返回
#图像(在图像的总值中)
#最有价值的直方图)。
#如果传入任何其他字符串作为模式,
#如果
#百分比差异小于alpha,并且
#否则就错了
def像素比较(im1,im2,mode=“pct”,alpha=.01):
如果im1.size==im2.size和im1.mode==im2.mode:
randPix=im1.getpixel((0,0))
最大和=[]
差异=[]
对于范围内的通道(len(randPix)):
差异+=[0.0]
最大和+=[0.0]
宽度=im1。尺寸[0]
高度=im1。尺寸[1]
对于范围内的i(宽度):
对于范围内的j(高度):
pixel1=im1.getpixel((i,j))
pixel2=im2.getpixel((i,j))
对于范围内的通道(len(randPix)):
最大和[通道]+=255
diff[channel]+=abs(像素1[channel]-像素2[channel])
如果模式==“pct”:
ret=()
对于范围内的通道(len(randPix)):
ret+=(差异[通道]/最大和[通道],)
回程网
对于范围内的通道(len(randPix)):
如果diff[channel]>alpha*maxSum[channel]:
返回错误
返回真值
返回错误
def XORCompare(im1,im2,mode=“pct”,alpha=.01):
如果im1.size==im2.size和im1.mode==im2.mode:
XORCount=[]
randPix=im1.getpixel((0,0))
对于范围内的通道(len(randPix)):
XORCount+=[0.0]
宽度=im1。尺寸[0]
高度=im1。尺寸[1]
imXOR=ImageXOR(im1,im2)
最大和=0.0
对于范围内的i(宽度):
对于范围内的j(高度):
pixel=imXOR.getpixel((i,j))
对于范围内的通道(透镜(像素)):
XORCount[通道]+=像素[通道]
最大和+=255
如果模式==“pct”:
ret=()
对于范围内的通道(len(randPix)):
ret+=(XORCount[通道]/maxSum,)
回程网
对于范围内的通道(len(randPix)):
如果XORCount[通道]>alpha*maxSum:
返回错误
返回真值
返回错误
def ImageCompare(im1,im2,mode=“pct”,alpha=.01):
如果im1.size==im2.size和im1.mode==im2.mode:
HistComp=组织比较(im1、im2,“pct”)
PixComp=像素比较(im1、im2,“pct”)
XORComp=XORCompare(im1,im2,“pct”)
如果模式==“pct”:
返回(HistComp、PixComp、XORComp)
如果模式==“alpha”:
如果HistComp>alpha:
返回错误
对于PixComp中的pct:
如果pct>α:
返回错误
对于XORComp中的pct:
如果pct>α:
返回错误
返回真值
返回错误
def查找差异(im1、im2):
如果im1.size==im2.size和im1.mode==im2.mode:
宽度=im1。尺寸[0]
高度=im2.尺寸[1]
ret=Image.new(im1.mode,im1.size)
对于范围内的i(宽度):
对于范围内的j(高度):
pixel1=im1.getpixel((i,j))