我想比较详细的图像比较,这些图像是使用网络摄像头捕获的。
我尝试使用OpenCV和其他Python库进行图像比较,当我进行图像的任何数字更改(使用PC(使用Paint)在图像上进行的更改)时,效果很好。
但是,当我用笔或其他任何物体对图像进行物理更改并使用网络摄像头捕获图像时,则同一库无法检测到对图像所做的更改。
导致此类问题的因素:
我的代码:
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个差异:
抽象图像(opencv):
预期输出:
它无法检测到所需的详细差异。
任何人都可以使用Python代码或详细图像库来帮助我,这些图像或库可以物理检测图像上的更改以比较上述两个图像。
有很多问题符合我的要求,但是没有一个将使用网络摄像头捕获的图像与所需结果进行比较。
请帮助我使用Python查找解决方案。