Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法提高两幅图像之间的差异点的精确度?_Python_Opencv_Tensorflow_Scipy_Computer Vision - Fatal编程技术网

Python 有没有办法提高两幅图像之间的差异点的精确度?

Python 有没有办法提高两幅图像之间的差异点的精确度?,python,opencv,tensorflow,scipy,computer-vision,Python,Opencv,Tensorflow,Scipy,Computer Vision,我正在尝试建立一个验证系统,可以指出两份扫描传单之间的差异 我模糊了两幅图像,找到单应性来对齐两幅图像,然后找到两幅图像之间的差异来绘制矩形 标准单张: 检查样本: 导入cv2 将numpy作为np导入 从skimage.measure导入将_ssim与ssim进行比较 从scipy导入ndimage #标签的最大匹配=1000000毫秒 文本的最大匹配=50000毫秒 良好匹配率=0.4 def mse(图像A、图像B): #两幅图像之间的“均方误差”是 #两幅图像之间的平方差之和; #注意:

我正在尝试建立一个验证系统,可以指出两份扫描传单之间的差异

我模糊了两幅图像,找到单应性来对齐两幅图像,然后找到两幅图像之间的差异来绘制矩形

标准单张:

检查样本:

导入cv2
将numpy作为np导入
从skimage.measure导入将_ssim与ssim进行比较
从scipy导入ndimage
#标签的最大匹配=1000000毫秒
文本的最大匹配=50000毫秒
良好匹配率=0.4
def mse(图像A、图像B):
#两幅图像之间的“均方误差”是
#两幅图像之间的平方差之和;
#注意:两个图像必须具有相同的尺寸
err=np.sum((imageA.astype(“float”)-imageB.astype(“float”)**2)
err/=float(imageA.shape[0]*imageA.shape[1])
返回错误
#返回MSE,错误越低,越“相似”
#这两个图像是
def差异移除bg(img0、img、img1):
d1=差异(img0,img)
d2=差异(img,img1)
返回cv2.按位_和(d1,d2)
def校准图像(im1、im2):
#将图像转换为灰度
im1Gray=cv2.CVT颜色(im1,cv2.COLOR\u BGR2GRAY)
im2Gray=cv2.CVT颜色(im2,cv2.COLOR\u BGR2GRAY)
#检测ORB特征并计算描述符。
orb=cv2.orb\u创建(最大匹配)
keypoints1,描述符1=orb.detectAndCompute(im1Gray,无)
keypoints2,描述符2=orb.detectAndCompute(im2Gray,无)
#匹配特征。
matcher=cv2.DESCRIPTOR\u create(cv2.DESCRIPTOR\u matcher\u BRUTEFORCE\u HAMMING)
matches=matcher.match(描述符1、描述符2、无)
#按分数对比赛进行排序
matches.sort(key=lambda x:x.distance,reverse=False)
#删除不太好的匹配项
numGoodMatches=int(长度(匹配)*良好匹配百分比)
匹配=匹配[:numGoodMatches]
#平局
imMatches=cv2.drawMatches(im1,keypoints1,im2,keypoints2,matches,None)
cv2.imwrite(“matches.png”,imMatches)
#提取好匹配的位置
points1=np.zero((len(匹配),2),dtype=np.float32)
points2=np.zero((len(匹配),2),dtype=np.float32)
对于i,在枚举中匹配(匹配项):
points1[i,:]=keypoints1[match.queryIdx].pt
点s2[i,:]=keypoints2[match.trainIdx].pt
#查找单应性
h、 mask=cv2.findHomography(点S1、点S2、cv2.RANSAC)
#使用单应
高度、宽度、通道=im2.2形状
im1Reg=cv2.翘曲透视图(im1,h,(宽度,高度))
返回im1Reg,h
#读取参考图像
refFilename=“standard.png”
打印(“读取参考图像:”,参考文件名)
imReference=cv2.imread(refFilename,cv2.imread\u颜色)
imReference=nImage.gaussian_滤波器(imReference,2)
imFilename=“sample fin.png”
打印(“读取要对齐的图像:”,imFilename);
im=cv2.imread(imFilename,cv2.imread\u COLOR)
im=nImage.gaussian_滤波器(im,2)
打印(“对齐图像…”)
#注册的图像将在imReg中重新存储。
#估计的单应性将存储在h中。
imReg,h=对齐图像(im,imReference)
#将对齐的映像写入磁盘。
outFilename=“aligned.png”
打印(“保存对齐图像:”,出纸口名称);
cv2.imwrite(输出文件名,imReg)
#打印估计单应
打印(“估计单应:\n”,h)
x1=imReg
x2=参考值
absdiff=cv2.absdiff(x1,x2)
打印(np.max(absdiff))
#最小检测阈值
阈值=absdiff<30
absdiff[阈值]=0
cv2.imwrite(“absdiff.png”,absdiff)
差=cv2。减去(x1,x2)
结果=非np.any(差异)
###########围绕差异绘制矩形##############
img=cv2.pyrDown(cv2.imread('absdiff.png',cv2.imread_不变))
img1=cv2.pyrDown(cv2.imread('aligned.png',cv2.imread_未更改))
ret,脱粒\u img=cv2.阈值(cv2.CVT颜色(img,cv2.颜色\u bgr2灰色),
40,40,cv2.阈值(二进制)
_,等高线,hier=cv2.查找到的轮廓(脱粒图像、cv2.RETR\u树、cv2.链近似图、简单图)
对于等高线中的c:
x、 y,w,h=cv2.boundingRect(c)
cv2.矩形(img1,(x-5,y-5),(x+w+10,y+h+10),(0255,0),2)
#得到最小面积
rect=cv2.minareact(c)
长方体=cv2.长方体点(矩形)
#将所有坐标浮点值转换为int
box=np.int0(box)
打印(透镜(轮廓))
cv2.imwrite(“cont-1.png”,img1)
差异图像:

指出错误:

我想提高这个算法的准确性。或者有没有其他方法可以用来解决这个问题

编辑:
我想删除传单末尾的额外矩形。单应性也不是完美的。为了得到这个结果,我必须对差异设定一个巨大的阈值

你似乎得到了很好的结果。你是如何定义准确度的?改进后的结果会是什么样子?@James我想删除传单末尾的额外矩形。单应性也不是完美的。为了得到这个结果,我必须对差异设定一个巨大的阈值。你似乎得到了很好的结果。你是如何定义准确度的?改进后的结果会是什么样子?@James我想删除传单末尾的额外矩形。单应性也不是完美的。为了得到这个结果,我必须对差异设定一个巨大的阈值。