Как найти разницу изображений в массивах numpy?

Я пытаюсь вычислить разницу между двумя изображениями. Я ожидаю целое число в качестве результата, но не получаю того, что ожидаю.

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>

Разница в изображениях может означать многое. Данные изображения, которые вы загружаете с помощью imread, будут представлять собой ndarray с формой (высота, ширина, каналы). Итак, если у вас есть 3 значения RGB для каждого пикселя изображения, как вы хотите определить разницу?

MYousefi 25.12.2020 08:09

Вот, я видел это. Похоже, это может дать целочисленный результат stackoverflow.com/questions/189943/…

max2p 25.12.2020 09:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
1 995
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

(Цветное) изображение представляет собой трехмерную матрицу, поэтому вы можете преобразовать это изображение в массив numpy с помощью numpy.array(image), а затем вы можете получить разницу между этими двумя массивами numpy.

Окончательный ответ будет трехмерным массивом.

деление результата на numpy Img1[0].size дает массив двумерных

max2p 25.12.2020 08:24

хорошо, так что если вы получили массив 2d, просто вычтите их, вы получите массив 2d в качестве ответа, его базовую матричную арифметику

ASLAN 25.12.2020 08:26

какое вычитание вы пытаетесь сделать, все еще сбивает с толку

ASLAN 25.12.2020 08:28

Я считаю, что размер массива 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], почти близкая к моему ожидаемому результату

max2p 25.12.2020 08:28

Мы можем использовать изменение формы массива numpy, чтобы сгладить его, используя ввод формы -1. Пожалуйста, попробуйте то же самое. numpyImg2.append(img2) diff = numpyImg1[0] - numpyImg2[0] result = sum(abs(diff.reshape(-1))) print("разница:", результат)

Nishad C M 25.12.2020 08:44

Теперь он дает мне число из нескольких цифр, но ответ должен быть не меньше 20 или около того, потому что image1 и image2 - это один и тот же кот, разница только в цвете фона.

max2p 25.12.2020 08:50

Похоже, это может дать мне целочисленный результат, аргументы arr для нормализации меня смущают, какое-нибудь объяснение по этому поводу? stackoverflow.com/questions/189943/…

max2p 25.12.2020 09:51
Ответ принят как подходящий

Это мой ответ о том, как найти разницу между двумя изображениями в каналах 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. Это предотвращает неожиданное поведение, такое как то, что вы только что видели.

Другие вопросы по теме