gpt4 book ai didi

Python OpenCV 不会在同一图像上给出相同的输出

转载 作者:行者123 更新时间:2023-12-02 16:07:05 25 4
gpt4 key购买 nike

我正在尝试创建一个程序来检查 2 个图像是否相同。我有以下代码,可以对两个图像执行:

img = cv2.imread('canvas.png')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (70,70,300,250)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
img = img[84:191, 84:203]
count = 1
cv2.imwrite("tmp/"+str(count)+".png", img)

第一次运行时,我得到以下输出: First image .大约 7 秒后,我使用完全 相同的图像进行操作,得到以下输出:Second image .我又试了一次,又得到了不同的输出:Third try?

我正在尝试检查图像是否相同(与内容相同),但我无法正常工作。我正在使用在 Stackoverflow 上找到的以下代码来检查相似性:

def is_similar(image1, image2):
return image1.shape == image2.shape and not(np.bitwise_xor(image1,image2).any())

当检查第一张图片和第二张图片时,返回 false。我怎样才能解决这个问题?

谢谢你的时间,

==== 编辑 ====

这里是 canvas.png

==== 编辑 2 ====

在查看了@Rotem 他们的回答后,我试过了,但它仍然显示出轻微的差异,上面的函数在以下情况下返回 False: Picture 1Picutre 2

最佳答案

cv2.grabCut 不会给出确定性结果,因为 GrabCut 算法使用内置的随机性

根据 Wikipedia :

This is used to construct a Markov random field over the pixel labels...

您可以通过在执行cv2.grabCut 之前重置OpenCV 随机生成器的种子来避免随机性:

cv2.setRNGSeed(0)

这是一个代码示例:

for count in range(10):
cv2.setRNGSeed(0)
img = cv2.imread('canvas.png')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (70,70,300,250)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
img = img[84:191, 84:203]
cv2.imwrite(str(count)+".png", img)

更新:

您可以使用以下循环来比较图像:

# Verify that all images are the same
for count in range(10):
im = cv2.imread(str(count)+".png")
is_same = is_similar(im, img)
if not is_same:
print('Images are not the same, and it is strange!')

在我的机器上它们都是一样的。


完整代码:

import cv2
import numpy as np

# Disable OpenCL and disable multi-threading.
cv2.ocl.setUseOpenCL(False)
cv2.setNumThreads(1)


def is_similar(image1, image2):
return image1.shape == image2.shape and not(np.bitwise_xor(image1,image2).any())

for count in range(10):
cv2.setRNGSeed(0)
img = cv2.imread('canvas.png')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (70,70,300,250)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
img = img[84:191, 84:203]
cv2.imwrite(str(count)+".png", img)


# Verify that all images are the same
for count in range(10):
im = cv2.imread(str(count)+".png")
is_same = is_similar(im, img)
if not is_same:
print('Images are not the same, and it is strange!')

关于Python OpenCV 不会在同一图像上给出相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com