Я хочу получить подробное сравнение изображений, которые снимаются с помощью веб-камеры.
Я попробовал OpenCV и другие библиотеки Python для сравнения изображений, которые хорошо работают, когда я делаю любое цифровое изменение изображения, то есть изменения, сделанные на изображении с использованиемПК (с использованием Paint).
Но когда я физически изменяю изображение с помощью пера или любого другого объекта и записываю изображение с помощью веб-камеры, эта же библиотека не может обнаружить изменение, сделанное на изображении.
Факторы, которые приводят к такой проблеме:
- камера (я использую Logitech C310)
- Внешний шум (я снимаю изображение при свете светодиодной трубки)
- При изменении дизайна он может немного сдвинуться, что также отображается как разница.
Мой код:
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)
Iне хочу использовать cv2.medianBlur
, так как это снизит качество изображения.
нет необходимости изменять размер или обрезать изображение, поскольку все изображения, снятые с помощью веб-камеры, будут одинакового размера.
Среда всегда останется неизменнойдля захвата изображения только дизайн будет меняться с небольшими изменениями (например, маленькие точки над дизайном).
Изображение 1:
Изображение 2:
Полученное изображение:
Он смог найти тысячи различий:
изображение absdiff (opencv):
ожидаемый выход:
Невозможно детализировать требуемую разницу,
Может ли кто-нибудь помочь мне с кодом или библиотекой Python для детального изображения, которое может физически обнаружить изменения, сделанные на изображении, для сравнения двух изображений, упомянутых выше.
Существует много вопросов, которые соответствуют моемутребования, но ни в коем случае не сравнивайте изображение, снятое с помощью веб-камеры, с требуемым результатом.
- Как сохранить постоянную среду для захвата изображения?
- Как выполнить детальное сравнение изображений(маленькая точечная точка)?
- какую камеру мне нужно использовать?
- Какой тип света мне нужно использовать для создания яркого и постоянного окружения?
- Есть лилюбой другой способ, любой другой язык программирования или библиотека, чтобы сделать это?
Помогите мне найти решение с помощью Python.