cv2.grabCut
не дает детерминированных c результатов, поскольку алгоритм GrabCut использует встроенную случайность .
Согласно Википедии :
Используется для построения поля Маркова random над метками пикселей ...
Вы можете избежать случайности, сбрасывая начальное число генератора случайных чисел OpenCV перед выполнением cv2.grabCut
:
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)
Обновление:
Вы можете использовать следующие l oop для сравнения изображений:
# 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!')