Я пытаюсь вычислить разницу между двумя изображениями. Я ожидаю целое число в качестве результата, но не получаю того, что ожидаю.
from imageio import imread
#https://raw.githubusercontent.com/glennford49/sampleImages/main/cat1.png
#https://raw.githubusercontent.com/glennford49/sampleImages/main/cat2.png
img1 = "cat1.png" # 183X276
img2 = "cat2.png" # 183x276
numpyImg1=[]
numpyImg2=[]
img1=imread(img1)
img2=imread(img2)
numpyImg1.append(img1)
numpyImg2.append(img2)
diff = numpyImg1[0] - numpyImg2[0]
result = sum(abs(diff))
print("difference:",result)
Распечатать:
# it prints an array of images rather than printing an interger only
цель:
difference: <int>
Вот, я видел это. Похоже, это может дать целочисленный результат stackoverflow.com/questions/189943/…
(Цветное) изображение представляет собой трехмерную матрицу, поэтому вы можете преобразовать это изображение в массив numpy
с помощью numpy.array(image)
, а затем вы можете получить разницу между этими двумя массивами numpy
.
Окончательный ответ будет трехмерным массивом.
деление результата на numpy Img1[0].size дает массив двумерных
хорошо, так что если вы получили массив 2d, просто вычтите их, вы получите массив 2d в качестве ответа, его базовую матричную арифметику
какое вычитание вы пытаетесь сделать, все еще сбивает с толку
Я считаю, что размер массива numpy не равен 1. Вам нужно выполнить сумму столько раз, сколько размер массива, чтобы иметь одно значение суммы.
[1,2,3]
sum gives : 6
[[1,2,3],[1,2,3]]
sum gives : [2,4,6]
doing a second sum opertion gives
: 12 (single value)
вам может потребоваться добавить еще одну «сумму (результат)» перед печатью данных (если изображение двухмерное).
например:
numpyImg2.append(img2)
diff = numpyImg1[0] - numpyImg2[0]
result = sum(abs(diff))
result = sum(result) >> Repeat
print("difference:",result)
это результат: разница: [191 14 25], почти близкая к моему ожидаемому результату
Мы можем использовать изменение формы массива numpy, чтобы сгладить его, используя ввод формы -1. Пожалуйста, попробуйте то же самое. numpyImg2.append(img2) diff = numpyImg1[0] - numpyImg2[0] result = sum(abs(diff.reshape(-1))) print("разница:", результат)
Теперь он дает мне число из нескольких цифр, но ответ должен быть не меньше 20 или около того, потому что image1 и image2 - это один и тот же кот, разница только в цвете фона.
Похоже, это может дать мне целочисленный результат, аргументы arr для нормализации меня смущают, какое-нибудь объяснение по этому поводу? stackoverflow.com/questions/189943/…
Это мой ответ о том, как найти разницу между двумя изображениями в каналах RGB.
Если нужно было вычесть 2 одинаковых изображения, печатает: разница на пиксель: 0
from numpy import sum
from imageio import imread
#https://github.com/glennford49/sampleImages/blob/main/cat2.png
#https://github.com/glennford49/sampleImages/blob/main/cat2.png
img1 = "cat1.png"
img2 = "cat2.png"
numpyImg1=[]
numpyImg2=[]
img1=imread(img1)
img2=imread(img2)
numpyImg1.append(img1)
numpyImg2.append(img2)
diff = numpyImg1[0] - numpyImg2[0]
result = sum(diff/numpyImg1[0].size)
result = sum(abs(result.reshape(-1)))
print("difference per pixel:",result)
Вы используете встроенную в Python функцию sum
, которая выполняет суммирование только по первому измерению массива NumPy . Это причина, по которой вы получаете двумерный массив в качестве вывода вместо одного целого числа, которое вы ожидаете. Вместо этого используйте numpy.sum для вашего результата, который будет внутренне сглаживать многомерный массив NumPy, а затем суммировать результаты. Кроме того, вы также можете использовать numpy.abs для абсолютных вычислений:
import numpy as np
result = np.sum(np.abs(diff))
Использование numpy.sum
означает, что вам больше не нужно преобразовывать массив в плоское представление перед использованием встроенной функции sum
в вашем ответе. Для будущих разработок всегда используйте методы NumPy для любых арифметических операций, которые вы хотите выполнять с массивами NumPy. Это предотвращает неожиданное поведение, такое как то, что вы только что видели.
Разница в изображениях может означать многое. Данные изображения, которые вы загружаете с помощью
imread
, будут представлять собой ndarray с формой (высота, ширина, каналы). Итак, если у вас есть 3 значения RGB для каждого пикселя изображения, как вы хотите определить разницу?