Глобальная централизация, затем нормализация изображения - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь централизовать изображение глобально с помощью

# example of global centering (subtract mean)
from numpy import asarray
from PIL import Image

# load image
image = Image.open('13.jpg')
pixels = asarray(image)

# convert from integers to floats
pixels = pixels.astype('float32')

# calculate global mean
mean = pixels.mean()
print('Mean: %.3f' % mean)
print('Min: %.3f, Max: %.3f' % (pixels.min(), pixels.max()))

# global centering of pixels
global_pixels = pixels - mean

# confirm it had the desired effect
mean = global_pixels.mean()
print('Mean: %.3f' % mean)
print('Min: %.3f, Max: %.3f' % (global_pixels.min(), global_pixels.max()))

Затем централизовать с помощью

# normalize to the range 0-1
pixels_new = global_pixels/ 255.0

# confirm the normalization
print('Min: %.3f, Max: %.3f' % (pixels_new.min(), pixels_new.max()))

plt.imshow(np.array(pixels_new))

plt.imsave('test1.png', pixels_new)

Я получаю предупреждение, а затем появляется ошибка

Обрезка входных данных до допустимого диапазона для imshow с данными RGB ([0..1] для чисел с плавающей запятой или [0..255] для целых чисел).

и затем с помощью функции plt.imsave

ValueError: Изображение с плавающей точкой Значения RGB должны быть в диапазоне 0..1.

Может кто-нибудь любезно объяснить, что не так?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Путем изменения

plt.imshow(np.array(pixels_new))

на

plt.imshow(np.array(pixels* 255).astype(np.uint8))

Это решило обе проблемы

Кажется, связано с этим https://github.com/matplotlib/matplotlib/issues/9391/

Обычно от здесь

0 голосов
/ 20 февраля 2020

Я предпочитаю opencv, потому что база фанатов больше, и ее проще использовать в сочетании с numpy. Я написал вам короткий пример того, как обращаться с красным каналом, потому что я предположил, что вы хотите отдельно усреднить все три слоя и применить среднее значение для каждого канала индивидуально:

from numpy import asarray
import cv2
import numpy as np
import matplotlib.pyplot as plt

path="/content/111.jpg"

# load image
img=cv2.imread(path,1)

# mean Pixel of Red layer
mean_R=np.sum(img[:,:,0])/(img.shape[0]*img.shape[1])
# Subtract calculated Mean_Red from all pixels
img_red_new=img[:,:,0]-mean_R
#eliminate all negative values
img_red_new=(img_red_new>=0)*img_red_new


# Validate Images and values
plt.imshow(img_red_new)
plt.figure()
plt.imshow(img[:,:,0])
print("Red_New:",np.max(img_red_new))
print("Red_old:",np.max(img[:,:,0]))
print("Mean:",mean_R)

# Safe as Image
cv2.imwrite("test.jpg",img_red_new)

Ваша ошибка в конце, потому что вы должны определить диапазон значений, в котором представлены ваши цвета. Между 0-1 или 0-255, это ваш выбор, но вы должны выбрать один. Так что просто нормализуйте изображение следующим образом:

max=np.max(image)
image=image/max --> values 0-1

Кроме того, вы можете преобразовать его обратно в целые числа без знака (0-255) с помощью:

image=image*255
image=image.astype(np.uint8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...