Python库无法通过网络摄像头捕获的两个移位图像之间的详细图像比较

时间:2019-02-08 10:08:45

标签: python opencv image-processing image-comparison

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

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

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

导致此类问题的因素:

  1. 相机(我正在使用Logitech 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)
  • 我不想使用cv2.medianBlur,因为这样会降低图像质量。

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

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

图片1:

Original Image

图片2:

Image to be compared

结果图像:

marking the difference

它能够找到1000个差异:

displaying the difference

抽象图像(opencv):

absdiff image

预期输出:

expected output

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

任何人都可以使用Python代码或详细图像库来帮助我,这些图像或库可以物理检测图像上的更改以比较上述两个图像。

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

  1. 如何归档恒定的环境以进行图像捕获?
  2. 如何进行细节图像比较(小的针尖点)?
  3. 我需要使用哪个相机?
  4. 我需要使用哪种类型的光来创建明亮而恒定的环境?
  5. 是否有其他方法,任何其他编程语言或库来执行此操作?

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

0 个答案:

没有答案