首页 > 解决方案 > Python 库无法在使用网络摄像头捕获的两个移位图像之间进行详细的图像比较

问题描述

我想要使​​用网络摄像头拍摄的详细图像比较。

我尝试使用 OpenCV 和其他 Python 库进行图像比较,当我对图像进行任何数字更改(即使用 PC(使用 Paint)对图像进行更改)时,它们效果很好。

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

导致此类问题的因素:

  1. 相机(我使用的是罗技 c310)
  2. 外部噪音(我在 LED 管灯下拍摄图像)
  3. 在更改设计时,它可能会发生一些变化,这也会显示为差异。

我的代码:

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)

图 1:

原始图像

图 2:

要比较的图像

结果图像:

标记差异

它能够找到 1000 个差异:

显示差异

absdiff 图像(opencv):

绝对差异图像

预期输出:

预期产出

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

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

有许多问题符合我的要求,但没有一个将使用网络摄像头捕获的图像与所需结果进行比较。

  1. 如何存档用于图像捕获的恒定环境?
  2. 如何进行细节图像比较(小针点)?
  3. 我需要使用哪个相机?
  4. 如果我需要使用什么类型的光来创造明亮和恒定的环境?
  5. 有没有其他方法,任何其他编程语言或库来做到这一点?

请帮助我使用 Python 找到解决方案。

标签: pythonopencvimage-processingimage-comparison

解决方案


推荐阅读