it-swarm.com.ru

Преобразовать черно-белое изображение в массив чисел?

 The image is 28 pixels by 28 pixels. They can interpret this as a big array of numbers: Как видно из изображения выше, как я могу преобразовать изображение слева в массив, представляющий темноту изображения между 0 for white и decimals for darker colours closer to 1? as shown in the image usingpython 3`? 

Обновление: Я пытался работать над этим больше. Ниже приведены и хорошие ответы.

# Load image 
filename = tf.constant("one.png")
image_file = tf.read_file(filename)

# Show Image
Image("one.png")

#convert method
def convertRgbToWeight(rgbArray):
    arrayWithPixelWeight = []
    for i in range(int(rgbArray.size / rgbArray[0].size)):
        for j in range(int(rgbArray[0].size / 3)):
            lum = 255-((rgbArray[i][j][0]+rgbArray[i][j][1]+rgbArray[i][j][2])/3) # Reversed luminosity
            arrayWithPixelWeight.append(lum/255) # Map values from range 0-255 to 0-1

    return arrayWithPixelWeight



# Convert image to numbers and print them
image_decoded_png = tf.image.decode_png(image_file,channels=3)
image_as_float32 = tf.cast(image_decoded_png, tf.float32)

numpy.set_printoptions(threshold=numpy.nan)
sess = tf.Session()
squeezedArray = sess.run(image_as_float32)

convertedList = convertRgbToWeight(squeezedArray)

print(convertedList) # This will give me an array of numbers. 
3
SamTheGoodOne

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

import cv2
import numpy as np

img_path = '/YOUR/PATH/IMAGE.png'
img = cv2.imread(img_path, 0) # read image as grayscale. Set second parameter to 1 if rgb is required 

Теперь img является массивом со значениями между 0 - 255. По умолчанию 0 соответствует черному цвету, а 255 - белому. Чтобы изменить это, вы можете использовать встроенную функцию opencv bitwise_not

img_reverted= cv2.bitwise_not(img)

Теперь мы можем масштабировать массив с помощью: 

new_img = img_reverted / 255.0  // now all values are ranging from 0 to 1, where white equlas 0.0 and black equals 1.0 
4
TimH

Загрузите изображение, а затем просто инвертируйте и разделите на 255.

Вот изображение ('Untitled.png'), которое я использовал для этого примера: https://ufile.io/h8ncw

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

my_img = cv2.imread('Untitled.png') 
inverted_img = (255.0 - my_img)  
final = inverted_img / 255.0

# Visualize the result
plt.imshow(final)
plt.show()

print(final.shape)
(661, 667, 3)

Результаты (конечный объект представлен в виде изображения):

 final image

1
seralou

Вы должны загрузить изображение из пути, а затем преобразовать его в массив numpy

Значения изображения будут в диапазоне от 0 до 255. Следующим шагом будет стандартизация массива numpy.

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

0
Daniel Gonzalez

Вы можете использовать пакет PIL для управления изображениями. Вот пример, как это можно сделать.

from PIL import Image
image = Image.open('sample.png')
width, height = image.size
pixels = image.load()

# Check if has alpha, to avoid "too many values to unpack" error
has_alpha = len(pixels[0,0]) == 4

# Create empty 2D list
fill = 1
array = [[fill for x in range(width)] for y in range(height)]

for y in range(height):
    for x in range(width):
        if has_alpha:
            r, g, b, a = pixels[x,y]
        else:
            r, g, b = pixels[x,y]
        lum = 255-((r+g+b)/3) # Reversed luminosity
        array[y][x] = lum/255 # Map values from range 0-255 to 0-1

Я думаю, что это работает, но, пожалуйста, обратите внимание, что единственный тест, который я сделал, был, если значения находятся в желаемом диапазоне:

# Test max and min values
h, l = 0,1
for row in array:
    h = max([max(row), h])
    l = min([min(row), l])
print(h, l)
0
JakubP