python - Python 库无法在使用网络摄像头捕获的两个移位图像之间进行详细的图像比较
问题描述
我想要使用网络摄像头拍摄的详细图像比较。
我尝试使用 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 找到解决方案。
解决方案
推荐阅读
- flutter - 颤振国际 0.17.0-nullsafety.2 包初始化日期格式化
- css - 给出溢出值隐藏了嵌套的sidenav
- python - 仅考虑正元素的列平均值
- javascript - Discord bot 查看登录用户在哪些服务器上
- linux - 如何在不触发OOM杀手的情况下查询内核内存池状态?
- stm32 - STM32 HAL UART接收中断清理缓冲区
- python - update QStyle in EnterEvent
- java - Thymeleaf Spring 5 在 web-inf 中找不到 html 模板
- javascript - 我正在运行的脚本退出了。我正在尝试从手机上传图片,但已停止工作
- c - 从结果类型为“void *”的函数返回“int”的不兼容整数到指针转换