Python库无法在使用网络摄像头捕获的两个移动图像之间进行详细的图像比较

Python库无法在使用网络摄像头捕获的两个移动图像之间进行详细的图像比较,python,opencv,image-processing,image-comparison,Python,Opencv,Image Processing,Image Comparison,我想有详细的图像比较,这是使用网络摄像头捕获 我尝试了OpenCV和其他Python库来进行图像比较,当我使用PC(使用Paint)对图像进行任何数字更改时,它们都能很好地工作 但是,当我使用钢笔或其他物体对图像进行物理更改,并使用网络摄像头拍摄图像时,同一个库无法检测到对图像所做的更改 导致此类问题的因素: 摄像头(我使用的是罗技c310) 外部噪音(我在LED管灯下拍摄图像) 当改变设计时,它可能会移动一点,这也会显示为差异 我的代码: from skimage.measure import

我想有详细的图像比较,这是使用网络摄像头捕获

我尝试了OpenCV和其他Python库来进行图像比较,当我使用PC(使用Paint)对图像进行任何数字更改时,它们都能很好地工作

但是,当我使用钢笔或其他物体对图像进行物理更改,并使用网络摄像头拍摄图像时,同一个库无法检测到对图像所做的更改

导致此类问题的因素:

  • 摄像头(我使用的是罗技c310)
  • 外部噪音(我在LED管灯下拍摄图像)
  • 当改变设计时,它可能会移动一点,这也会显示为差异
  • 我的代码:

    from skimage.measure import compare_ssim
    import argparse
    import imutils
    import cv2
    import numpy as np
    
    # load the two input images
    imageA = cv2.imread('./t_0.png')
    cv2.imwrite("./test/org.jpg", imageA)
    # imageA = cv2.medianBlur(imageA,29)
    imageB = cv2.imread('./t_1.png')
    cv2.imwrite("./test/test.jpg", imageB)
    # imageB = cv2.medianBlur(imageB,29)
    
    # convert the images to grayscale
    grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
    grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
    
    ##########################################################################################################
    
    difference = cv2.subtract(grayA,grayB)    
    result = not np.any(difference)
    if result is True:
        print ("Pictures are the same")
    else:
        cv2.imwrite("./test/open_cv_subtract.jpg", difference )
        print ("Pictures are different, the difference is stored.")
    
    ##########################################################################################################
    
    diff = cv2.absdiff(grayA, grayB)
    cv2.imwrite("./test/absdiff.png", diff)
    
    ##########################################################################################################
    
    grayB=cv2.resize(grayB,(grayA.shape[1],grayA.shape[0]))
    (score, diff) = compare_ssim(grayA, grayB, full=True)
    diff = (diff * 255).astype("uint8")
    print("SSIM: {}".format(score))
    
    #########################################################################################################
    
    thresh = cv2.threshold(diff, 25, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    #s = imutils.grab_contours(cnts)
    count = 0
    # loop over the contours
    for c in cnts:
        # images differ
        count=count+1
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
        cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)
    
    ##########################################################################################################
    
    print (count)
    cv2.imwrite("./test/original.jpg", imageA)
    # cv2.imshow("Modified", imageB)
    cv2.imwrite("./test/test_image.jpg", imageB)
    cv2.imwrite("./test/compare_ssim.jpg", diff)
    cv2.imwrite("./test/thresh.jpg", thresh)
    cv2.waitKey(0)
    
    • 我不想使用
      cv2.medianBlur
      ,因为这样会降低图像质量

    • 无需调整图像大小或裁剪图像,因为使用网络摄像头捕获的所有图像大小相同

    • 对于图像捕获,环境将始终保持不变,只有设计会随着微小的变化而变化(如设计上的小点)

    图1:

    图2:

    结果图像:

    它能够找到1000个差异:

    absdiff图像(opencv):

    预期产出:

    它无法检测所需的详细差异

    任何人都可以帮助我使用Python代码或详细图像库,它可以检测对图像所做的物理更改,以比较上面提到的两个图像

    有很多问题符合我的要求,但没有一个会将使用网络摄像头拍摄的图像与要求的结果进行比较

  • 如何归档用于图像捕获的恒定环境
  • 如何进行细节图像比较(小针点点)
  • 我需要用哪台照相机
  • 如果我需要使用什么类型的光来创造一个明亮和恒定的环境
  • 有没有其他的方法,其他的编程语言或库可以做到这一点
    请帮助我找到使用Python的解决方案。

    cv2.absdiff
    是正确的方法,但您需要从差异中删除非常小的区域(一个像素不同并不意味着什么,您无法测量如此小的变化),并且需要包含一个阈值(亮度的微小变化是由噪声引起的,而不是物体的变化)@CrisLuengo我已经为absdiff添加了图像,我这边的问题是,在更改设计时,它可能会移动位,这也会显示为差异。好吧,如果图像移动,你必须先找到该移动并更正它。查找互相关,这是最简单的方法,如果只是一个移动,它会很好地工作(没有旋转或改变视角)。为了考虑旋转,傅里叶-梅林变换是最简单的方法。随着透视图的变化,事情变得复杂得多。@UjwalaPatil要处理移动,您需要使用
    cv2.drawContours
    。为两幅图像制作模板后,您可以使用
    cv2.matchTemplate
    。您可以找到许多可用于匹配模板的代码。您需要搜索用于标记模板的代码。我希望
    cv2.drawContours
    可以帮助您标记模板。您的意思是如何检查
    图像[i+1,j]的值
    当您在位置
    i,j
    迭代图像时?使用普通索引…您只需首先确保
    i+1
    仍在图像域中。
    cv2.absdiff
    是正确的方法,但您需要从差异中删除非常小的区域(一个像素不同并不意味着什么,你不能测量这么小的变化),你需要包括一个阈值(亮度的微小变化是由噪声引起的,而不是对象的变化)@CrisLuengo我已经为absdiff添加了图像,我这边的问题是,在更改设计时,它可能会移动位,这也会显示为差异。好吧,如果图像移动,你必须先找到该移动并更正它。查找互相关,这是最简单的方法,如果只是一个移动,它会很好地工作(没有旋转或改变视角)。为了考虑旋转,傅里叶-梅林变换是最简单的方法。随着透视图的变化,事情变得复杂得多。@UjwalaPatil要处理移动,您需要使用
    cv2.drawContours
    。为两幅图像制作模板后,您可以使用
    cv2.matchTemplate
    。您可以找到许多可用于匹配模板的代码。您需要搜索用于标记模板的代码。我希望
    cv2.drawContours
    可以帮助您标记模板。您的意思是如何检查
    图像[i+1,j]的值
    当您在位置
    i,j
    迭代图像时,使用普通索引…您只需首先确保
    i+1
    仍在图像域中。