[Python+OpenCv]近似图像差异检测 | 您所在的位置:网站首页 › 图片像素分析 › [Python+OpenCv]近似图像差异检测 |
最新源码已更新(包含测试图像): https://github.com/XuPeng23/CV/tree/main/Difference%20Detection%20In%20Similar%20Images 图像压缩包解压一下和python文件放一个目录应该就能直接跑起来了 一、摘要两幅相似的图像,如果整体位置一样,仅仅是在一些地方有差异(如图1-1),那么只需要相减就能得出差异部分。而现实情况往往复杂得多,由于拍摄时间、角度不同,两幅图像可能存在视角、灰度、旋转、尺度等的差异(如图1-2),因此找出两幅图像之间的变换关系是实现该功能的前提。
本文使用单应性变换来表示两幅图像之间的变换关系,得出单应性变换需要至少3对匹配对,在图像特征匹配部分使用了SIFT描述子,因为考虑到SIFT拥有良好的灰度不变性、旋转不变性和尺度不变性。在两幅图像中找出SIFT特征点并进行匹配得到预匹配集,接着通过与相邻匹配对的距离比例关系剔除一部分匹配对,剩下的匹配对认为是比较好的,用来找出单应性变换。 # 载入图像 img1 = cv2.imread('./datahomo6/img1.png') img2 = cv2.imread('./datahomo6/img2.png') sift = cv2.xfeatures2d.SIFT_create() # 检测关键点 kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # 关键点匹配 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 6) search_params = dict(checks = 10) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1,des2,k=2) good = [] for m,n in matches: if m.distance = 0) & (demo_dst[i][0][0] >= 0): if difference shreshood: if func == 1: cv2.circle(output, (demo_src[i][0][0],demo_src[i][0][1]),1, (0, 0, 255), 2) cv2.circle(output, (int(demo_dst[i][0][0]+width),demo_dst[i][0][1]),1, (0, 0, 255), 2) if func == 2: diffLeft.append([demo_src[i][0][0],demo_src[i][0][1]]) diffRight.append([demo_dst[i][0][0],demo_dst[i][0][1]])之后将差异大于阈值的点对输出: 最后把检测到的差异点聚类一下 |
CopyRight 2018-2019 实验室设备网 版权所有 |