Сравните несколько изображений на основе значений пикселей - PullRequest
2 голосов
/ 02 октября 2019

Привет. Я пытаюсь сравнить набор изображений, в которых я хочу получить окончательное изображение с максимальным количеством пикселей для каждого отдельного изображения. Скажем, у меня есть 3 изображения (преобразованные в матрицу 10x10), в которых я знаю значения пикселей каждого блока> Теперь я хочу сравнить эти значения блок за блоком и получить окончательное отдельное изображение с максимальными значениями блока для каждого изображения.

Для этого я изменил размеры изображения (250x250) так, чтобы каждый блок представлял собой квадрат 25x25

Я даже попытался сравнить два изображения и взять максимальные пиксели из обоих изображений и отобразить их

image = cv2.resize(im,(250,250))
hs,ws,c= image.shape
print(hs, ws,c)
hs = round(h/10)
ws = round(w/10)
resized = cv2.resize(image, (ws,hs), interpolation = cv2.INTER_AREA)
cv2.imshow("Resized image", resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(list(resized))
#comparing two images
data = np.maximum.reduce([resized,resized1])
from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()

Таким образом, это два изображения, а мозаичное изображение является результатом блока # сравнения двух изображений. Теперь, используя эти два изображения, я хочу получить окончательное изображение, похожее на исходные фотографии, но не на мозаичную версию, а на конечной фотографии должны быть пиксели от обеих исходных фотографий (максимум от каждой). Я надеюсь, что это проясняет вопрос

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Для лучшей визуализации я пропускаю всю часть изменения размера , которую вы получили ранее , и придерживаюсь изображений с измененным размером (250 x 250).

Мой подход заключается в следующем: сохранить все изображения с измененным размеромв некотором массиве NumPy с размерами (width x height x numberOfChannels x numberOfImages), а затем используйте NumPy's max вдоль axis=3, так что вы получите окончательное изображение (width x height x numberOfChannels) с максимальными значениями BGR (или оттенками серого, если необходимо) в течениевсе изображения.

Вот примерный код:

import cv2
import numpy as np

# Set up empty images array
width, height, nChannels, nImages = (250, 250, 3, 3)
images = np.zeros((width, height, nChannels, nImages), np.uint8)

# Read and resize exemplary input images
images[:, :, :, 0] = cv2.resize(cv2.imread('WeQow.png'), (width, height))
images[:, :, :, 1] = cv2.resize(cv2.imread('gIHOd.png'), (width, height))
images[:, :, :, 2] = cv2.resize(cv2.imread('lAdfO.jpg'), (width, height))

# Generate maximum image along last axis, i.e. the images.
# For each BGR value you get the maximum over all images.
image = images.max(axis=3)

# Show images
cv2.imshow('image0', images[:, :, :, 0])
cv2.imshow('image1', images[:, :, :, 1])
cv2.imshow('image2', images[:, :, :, 2])
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Это три входных изображения:

Input 1

Input 2

Input 3

Окончательное изображение будет выглядеть следующим образом:

Output

Надеюсь, это поможет!

1 голос
/ 02 октября 2019

Вы можете попробовать использовать функцию block_reduce с размером блока (no_of_images, channels, block_height, block_width).

skimage.measure.block_reduce(np.asarray([image1, image2, image3,...]), (no_of_images, channels, 1, 1), np.max)

Если ваши входные изображения в масштабе RGB и вы хотите максимальное значение для каждого канала (выводите также изображение RGB) средиизображения просто заменяют channels value with 1, или если вы хотите, чтобы максимальное значение по каналам среди изображений, затем используйте 3 as channels value, который сгенерирует изображение в оттенках серого.

...