'numpy.float64' object cannot be interpreted as an integer при вычислении метрик

Всем привет. Имеется оригинально и эталонное изображение, по которому ищу контуры различными методами. Пытаюсь высчитать метрики, чтобы понять какой результат лучше. Собственно при выполнении кода получаю такой вывод ошибок.

Traceback (most recent call last):
  File "d:/Test/sobel_skimage.py", line 52, in <module>
    error, precision, recall = adapted_rand_error(ideal, np.array(im_test))
  File "C:\Users\Dmitry\AppData\Local\Programs\Python\Python38\lib\site-packages\skimage\metrics\_adapted_rand_error.py", line 53, in adapted_rand_error
    p_ij = contingency_table(image_true, image_test,
  File "C:\Users\Dmitry\AppData\Local\Programs\Python\Python38\lib\site-packages\skimage\metrics\_contingency_table.py", line 39, in contingency_table
    cont = sparse.coo_matrix((data, (im_true_r, im_test_r))).tocsr()
  File "C:\Users\Dmitry\AppData\Local\Programs\Python\Python38\lib\site-packages\scipy\sparse\coo.py", line 149, in __init__
    N = operator.index(np.max(col)) + 1
TypeError: 'numpy.float64' object cannot be interpreted as an integer

Код:

import sys
from skimage import filters
from skimage import feature
from PIL import Image
from skimage.metrics import variation_of_information
from skimage.metrics import adapted_rand_error
import cv2 as cv
import matplotlib.pyplot as plt
import matplotlib        as mpl
import numpy as np
import os
import time

def recolored(img):
    width, height = img.shape
    for i in range(width):
        for j in range(height):
            if(img[i,j]<0):
                img[i,j] = 0.0
            else:
                img[i,j] = img[i,j]
    return img

    
src = cv.imread("C:\\temp\\map-forest.png", cv.IMREAD_COLOR)

ideal = cv.imread("C:\\temp\\edges_ideal.png", cv.IMREAD_COLOR)
ideal = cv.cvtColor(ideal, cv.COLOR_BGR2GRAY)
    
src_blur = cv.GaussianBlur(src, (3, 3), 0)
    
gray = cv.cvtColor(src_blur, cv.COLOR_BGR2GRAY)

edges_laplace = filters.laplace(gray)
edges_roberts = filters.roberts(gray)
edges_farid = filters.farid(gray)
edges_scharr = filters.scharr(gray)
edges_sobel = filters.sobel(gray)
edges_prewitt = filters.prewitt(gray)
edges_canny = feature.canny(gray)

edges_laplace = recolored(edges_laplace)

precision_list = []
recall_list = []
split_list = []
merge_list = []

method_names = ['Laplace', 'Roberts', 'Farid', 'Scharr', 'Sobel', 'Prewitt', 'Canny']
for name, im_test in zip(method_names, [edges_laplace, edges_roberts, edges_farid, edges_scharr, edges_sobel, edges_prewitt, edges_canny]):
    error, precision, recall = adapted_rand_error(ideal, im_test)
    splits, merges = variation_of_information(ideal, im_test)
    split_list.append(splits)
    merge_list.append(merges)
    precision_list.append(precision)
    recall_list.append(recall)
    print(f"\n## Method: {name}")
    print(f"Adapted Rand error: {error}")
    print(f"Adapted Rand precision: {precision}")
    print(f"Adapted Rand recall: {recall}")
    print(f"False Splits: {splits}")
    print(f"False Merges: {merges}")

Ответы (1 шт):

Автор решения: Alex Alex

У вас в adapted_rand_error подаются изображения разного типа. ideal - в целых: uint8, скорее всего, а какой-нибудь edges_sobel в float64.

→ Ссылка