将黑白图像转换为数字数组?
Convert a black and white image to array of numbers?
如上图所示,如何将左侧的图像转换为表示 0 for white
和 decimals for darker colours closer to 1? as shown in the image using
python 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.
您必须从路径加载图像,然后将其转换为 numpy array。
图像的值将在 0 到 255 之间。下一步是标准化 numpy 数组。
希望对您有所帮助。
您可以使用 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)
我建议使用 opencv 读入图像。 opencv最大的优点是支持多种图片格式,自动将图片转为numpy数组。例如:
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
之间的 numpy 数组。默认情况下,0 等于黑色,255 等于白色。要更改此设置,您可以使用 opencv 内置函数 bitwise_not
:
img_reverted= cv2.bitwise_not(img)
我们现在可以缩放数组:[=16=]
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
加载图像,然后反转并除以 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)
结果(最终对象表示为图像):
0 for white
和 decimals for darker colours closer to 1? as shown in the image using
python 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.
您必须从路径加载图像,然后将其转换为 numpy array。
图像的值将在 0 到 255 之间。下一步是标准化 numpy 数组。
希望对您有所帮助。
您可以使用 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)
我建议使用 opencv 读入图像。 opencv最大的优点是支持多种图片格式,自动将图片转为numpy数组。例如:
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
之间的 numpy 数组。默认情况下,0 等于黑色,255 等于白色。要更改此设置,您可以使用 opencv 内置函数 bitwise_not
:
img_reverted= cv2.bitwise_not(img)
我们现在可以缩放数组:[=16=]
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
加载图像,然后反转并除以 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)