'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.