Python 有没有一种方法可以在比较图像时在opencv中设置阈值?

Python 有没有一种方法可以在比较图像时在opencv中设置阈值?,python,opencv,Python,Opencv,因此,我在python中使用OpenCV,并将视频中的帧与基础图像进行比较,以确定相似性: import cv2 import numpy as np import os frame_list = ['frame0.jpg', 'frame1.jpg', 'frame10.jpg', 'frame100.jpg', 'frame101.jpg', 'frame102.jpg', 'frame103.jpg', 'frame104.jpg', 'frame105.jpg', 'frame106

因此,我在python中使用OpenCV,并将视频中的帧与基础图像进行比较,以确定相似性:

import cv2
import numpy as np
import os


frame_list = ['frame0.jpg', 'frame1.jpg', 'frame10.jpg', 'frame100.jpg', 'frame101.jpg', 'frame102.jpg', 'frame103.jpg', 'frame104.jpg', 'frame105.jpg', 'frame106.jpg', 'frame107.jpg', 'frame108.jpg', 'frame109.jpg', 'frame11.jpg', 'frame110.jpg', 'frame111.jpg', 'frame112.jpg', 'frame113.jpg', 'frame114.jpg', 'frame115.jpg', 'frame116.jpg', 'frame117.jpg', 'frame118.jpg', 'frame119.jpg', 'frame12.jpg', 'frame120.jpg', 'frame121.jpg', 'frame122.jpg', 'frame123.jpg', 'frame124.jpg', 'frame125.jpg', 'frame126.jpg', 'frame127.jpg', 'frame128.jpg', 'frame129.jpg', 'frame13.jpg', 'frame130.jpg', 'frame131.jpg', 'frame132.jpg', 'frame133.jpg', 'frame134.jpg', 'frame135.jpg', 'frame136.jpg', 'frame137.jpg', 'frame138.jpg', 'frame139.jpg', 'frame14.jpg', 'frame140.jpg', 'frame141.jpg', 'frame142.jpg', 'frame143.jpg', 'frame144.jpg', 'frame145.jpg', 'frame146.jpg', 'frame147.jpg', 'frame148.jpg', 'frame149.jpg', 'frame15.jpg', 'frame150.jpg', 'frame151.jpg', 'frame152.jpg', 'frame153.jpg', 'frame154.jpg', 'frame155.jpg', 'frame156.jpg', 'frame157.jpg', 'frame158.jpg', 'frame159.jpg', 'frame16.jpg', 'frame160.jpg', 'frame161.jpg', 'frame162.jpg', 'frame163.jpg', 'frame164.jpg', 'frame165.jpg', 'frame166.jpg', 'frame167.jpg', 'frame168.jpg', 'frame169.jpg', 'frame17.jpg', 'frame170.jpg', 'frame171.jpg', 'frame172.jpg', 'frame173.jpg', 'frame174.jpg', 'frame175.jpg', 'frame176.jpg', 'frame177.jpg', 'frame178.jpg', 'frame179.jpg', 'frame18.jpg', 'frame180.jpg', 'frame181.jpg', 'frame182.jpg', 'frame183.jpg', 'frame184.jpg', 'frame185.jpg', 'frame186.jpg', 'frame187.jpg', 'frame188.jpg', 'frame189.jpg', 'frame19.jpg', 'frame190.jpg', 'frame191.jpg', 'frame192.jpg', 'frame193.jpg', 'frame194.jpg', 'frame195.jpg', 'frame196.jpg', 'frame197.jpg', 'frame198.jpg', 'frame199.jpg', 'frame2.jpg', 'frame20.jpg', 'frame200.jpg', 'frame201.jpg', 'frame202.jpg', 'frame203.jpg', 'frame204.jpg', 'frame205.jpg', 'frame206.jpg', 'frame207.jpg', 'frame208.jpg', 'frame209.jpg', 'frame21.jpg', 'frame210.jpg', 'frame211.jpg', 'frame212.jpg', 'frame213.jpg', 'frame214.jpg', 'frame215.jpg', 'frame216.jpg', 'frame217.jpg', 'frame218.jpg', 'frame219.jpg', 'frame22.jpg', 'frame220.jpg', 'frame221.jpg', 'frame222.jpg', 'frame223.jpg', 'frame224.jpg', 'frame225.jpg', 'frame226.jpg', 'frame227.jpg', 'frame228.jpg', 'frame229.jpg', 'frame23.jpg', 'frame230.jpg', 'frame231.jpg', 'frame232.jpg', 'frame233.jpg', 'frame234.jpg', 'frame235.jpg', 'frame236.jpg', 'frame237.jpg', 'frame238.jpg', 'frame239.jpg', 'frame24.jpg', 'frame240.jpg', 'frame241.jpg', 'frame242.jpg', 'frame243.jpg', 'frame244.jpg', 'frame245.jpg', 'frame246.jpg', 'frame247.jpg', 'frame248.jpg', 'frame249.jpg', 'frame25.jpg', 'frame250.jpg', 'frame251.jpg', 'frame252.jpg', 'frame253.jpg', 'frame254.jpg', 'frame255.jpg', 'frame256.jpg', 'frame257.jpg', 'frame258.jpg', 'frame259.jpg', 'frame26.jpg', 'frame260.jpg', 'frame261.jpg', 'frame262.jpg', 'frame263.jpg', 'frame264.jpg', 'frame265.jpg', 'frame266.jpg', 'frame267.jpg', 'frame268.jpg', 'frame269.jpg', 'frame27.jpg', 'frame270.jpg', 'frame271.jpg', 'frame272.jpg', 'frame273.jpg', 'frame274.jpg', 'frame275.jpg', 'frame276.jpg', 'frame277.jpg', 'frame278.jpg', 'frame279.jpg', 'frame28.jpg', 'frame280.jpg', 'frame281.jpg', 'frame282.jpg', 'frame283.jpg', 'frame284.jpg', 'frame285.jpg', 'frame286.jpg', 'frame287.jpg', 'frame288.jpg', 'frame289.jpg', 'frame29.jpg', 'frame290.jpg', 'frame291.jpg', 'frame292.jpg', 'frame293.jpg', 'frame294.jpg', 'frame295.jpg', 'frame296.jpg', 'frame297.jpg', 'frame298.jpg', 'frame299.jpg', 'frame3.jpg', 'frame30.jpg', 'frame300.jpg', 'frame301.jpg', 'frame302.jpg', 'frame303.jpg', 'frame304.jpg', 'frame305.jpg', 'frame306.jpg', 'frame307.jpg', 'frame308.jpg', 'frame309.jpg', 'frame31.jpg', 'frame310.jpg', 'frame311.jpg', 'frame312.jpg', 'frame313.jpg', 'frame314.jpg', 'frame315.jpg', 'frame316.jpg', 'frame317.jpg', 'frame318.jpg', 'frame319.jpg', 'frame32.jpg', 'frame320.jpg', 'frame321.jpg', 'frame322.jpg', 'frame323.jpg', 'frame324.jpg', 'frame325.jpg', 'frame326.jpg', 'frame327.jpg', 'frame328.jpg', 'frame329.jpg', 'frame33.jpg', 'frame330.jpg', 'frame331.jpg', 'frame332.jpg', 'frame333.jpg', 'frame334.jpg', 'frame335.jpg', 'frame336.jpg', 'frame337.jpg', 'frame338.jpg', 'frame339.jpg', 'frame34.jpg', 'frame340.jpg', 'frame341.jpg', 'frame342.jpg', 'frame343.jpg', 'frame344.jpg', 'frame345.jpg', 'frame346.jpg', 'frame347.jpg', 'frame348.jpg', 'frame349.jpg', 'frame35.jpg', 'frame350.jpg', 'frame351.jpg', 'frame352.jpg', 'frame353.jpg', 'frame354.jpg', 'frame355.jpg', 'frame356.jpg', 'frame357.jpg', 'frame358.jpg', 'frame359.jpg', 'frame36.jpg', 'frame360.jpg', 'frame361.jpg', 'frame362.jpg', 'frame363.jpg', 'frame364.jpg', 'frame365.jpg', 'frame366.jpg', 'frame367.jpg', 'frame368.jpg', 'frame369.jpg', 'frame37.jpg', 'frame370.jpg', 'frame371.jpg', 'frame372.jpg', 'frame373.jpg', 'frame374.jpg', 'frame375.jpg', 'frame376.jpg', 'frame377.jpg', 'frame378.jpg', 'frame379.jpg', 'frame38.jpg', 'frame380.jpg', 'frame381.jpg', 'frame382.jpg', 'frame383.jpg', 'frame384.jpg', 'frame385.jpg', 'frame386.jpg', 'frame387.jpg', 'frame388.jpg', 'frame389.jpg', 'frame39.jpg', 'frame390.jpg', 'frame391.jpg', 'frame392.jpg', 'frame393.jpg', 'frame4.jpg', 'frame40.jpg', 'frame41.jpg', 'frame42.jpg', 'frame43.jpg', 'frame44.jpg', 'frame45.jpg', 'frame46.jpg', 'frame47.jpg', 'frame48.jpg', 'frame49.jpg', 'frame5.jpg', 'frame50.jpg', 'frame51.jpg', 'frame52.jpg', 'frame53.jpg', 'frame54.jpg', 'frame55.jpg', 'frame56.jpg', 'frame57.jpg', 'frame58.jpg', 'frame59.jpg', 'frame6.jpg', 'frame60.jpg', 'frame61.jpg', 'frame62.jpg', 'frame63.jpg', 'frame64.jpg', 'frame65.jpg', 'frame66.jpg', 'frame67.jpg', 'frame68.jpg', 'frame69.jpg', 'frame7.jpg', 'frame70.jpg', 'frame71.jpg', 'frame72.jpg', 'frame73.jpg', 'frame74.jpg', 'frame75.jpg', 'frame76.jpg', 'frame77.jpg', 'frame78.jpg', 'frame79.jpg', 'frame8.jpg', 'frame80.jpg', 'frame81.jpg', 'frame82.jpg', 'frame83.jpg', 'frame84.jpg', 'frame85.jpg', 'frame86.jpg', 'frame87.jpg', 'frame88.jpg', 'frame89.jpg', 'frame9.jpg', 'frame90.jpg', 'frame91.jpg', 'frame92.jpg', 'frame93.jpg', 'frame94.jpg', 'frame95.jpg', 'frame96.jpg', 'frame97.jpg', 'frame98.jpg', 'frame99.jpg']

for i in range (len(frame_list)):
    image1 = cv2.imread(frame_list[i])
    image2 = cv2.imread("Comparison.jpg")

    difference = cv2.subtract(image1, image2)

    result = not np.any(difference) #if difference is all zeros it will return False

    if result is True:
        print("Frame " + str(i) + " is the same")
    else:
        cv2.imwrite("result.jpg", difference)
        print("Frame " + str(i) + " is different")

我的问题是,我是否可以使用一个阈值来确定图像是否相同,比如说50%,只是将它们分类为完全相同?如果你有答案,我将不胜感激。提前谢谢

我有一大堆电影的画面。它们是连续的(30、31、32、33),因此没有太大区别:

import os
import cv2
import numpy as np

frame_list = [f'{mypath}\\{f}' for f in listdir(mypath) if isfile(join(mypath, f))]

threshold = 0.2
for i in range(1, len(frame_list)):
   im_a = cv2.imread(frame_list[i-1], cv2.IMREAD_GRAYSCALE) + 1.0
   im_b = cv2.imread(frame_list[i], cv2.IMREAD_GRAYSCALE) + 1.0

   pct_diff = np.mean(np.absolute(im_a - im_b) / im_a)

   if abs(pct_diff - threshold) > 1e-12:
       print(f'Percent Difference: {pct_diff*100:.3f}% --> Not different enough')
输出:

Percent Difference: 0.029% --> Not different enough
Percent Difference: 0.018% --> Not different enough
Percent Difference: 0.025% --> Not different enough
Percent Difference: 0.024% --> Not different enough
Percent Difference: 0.040% --> Not different enough
Percent Difference: 0.029% --> Not different enough

是的,你可以这样做,但你需要定义“50%相同”的含义。例如,您可以找到图像之间的百分比差异而不是线性差异,只需取图像矩阵的平均值
np.mean()
,如果
average>0.5
,则可以将它们称为不同的。您应该使用absDiffernce()而不是减法。减法可能会在零处截断。只需计算非零像素数,然后除以像素总数,再乘以100即可得到百分比。或者,您可以在除0之外的某个值设置差异图像的阈值,并计算白色像素的数量,然后执行相同的操作。谢谢您的回答!我测试了一下,它成功了。但是,当我测试它时,对一些帧的评估是不准确的(例如,它的读数为0.129%,而不是它应该读数的0.052%)。我使用了与您完全相同的代码,并通过去掉所有for循环并将单个图像放入代码中进行了测试。有问题吗?我这里用的是百分比差。确保帧“差”的计算方法相同。此外,我只是在我的路径中按字母顺序循环浏览文件。实现框架列表的版本。