我有以下定义来创建一个以灰度显示图像的函数:
def escala_grises(imagen):
''' Transforma una imagen en color a grados de grises
ENTRADA:
- imagen: matriz de píxeles -> [[(float, float, float)]]
SALIDA:
- matriz de píxeles con la imagen de entrada en escala de grises -> [[float]]
Toma como entrada una matriz de píxeles RGB, y produce como salida una
matriz de píxeles con intensidades en escala de grises (un único valor por
cada pixel).
Para convertir una imagen en color a escala de grises hay que aplicar
los siguientes pesos para integrar los tres canales de color en un único
valor de intensidad:
- Rojo: 0.2989
- Verde: 0.5870
- Azul: 0.1140
'''
参数imagen
是使用数组从“.jpeg”文件中提取的数组。例如:[[[82, 119, 171], [91, 128, 180], [85, 122, 174], [84, 121, 173], [88, 125, 177], [84, 121, 173], [84, 121, 173], [85, 122, 174]]]
。
我猜它是一个 3D 数组,因为方法shape
返回(330, 600, 3)
,我认为 3 来自“RGB”文件中存在的颜色数。
[0.2989, 0.5870, 0.1140]
问题是,考虑到我只能使用以下导入的模块,如何修改数组以使平均颜色强度匹配:
from matplotlib import pyplot as plt
import numpy as np
- 回复 abulafia 关于评论
显然,我不应该使用métodos
图书馆numpy
,因为我不应该给他们。因此,我尝试使用以下代码重新创建您告诉我的内容:
filtro = []
for i in imagen:
for r,g,b in i:
rojo = r*0.2989
verde = g*0.5870
azul = b*0.1140
numero = [int(rojo + verde + azul)]
filtro.append(numero)
return filtro
但它给出了一个带有错误的空白图像:
ValueError: Image size of 1x198000 pixels is too large. It must be less than 2^16 in each direction.
附灰度功能和图像显示功能测试:
def test_escala_grises(imagen):
grises = escala_grises(imagen)
muestra_imagen(grises, cmap='gray')
guarda_imagen('../img/grises.jpeg', grises, cmap='gray')
def muestra_imagen(imagen, cmap=None):
imagen = np.array(imagen, dtype='uint8')
plt.imshow(imagen, cmap=cmap)
plt.show()
将每个像素转换为灰度的代码是正确的。但是你有一个错误:
escala_grises()
不再像输入图像那样是二维数组,而只是像素序列。你必须使用reshape
它来恢复它原来的二维形状,否则plt.imgshow()
它不知道如何显示它。cmap="Gray_r"
来使用灰度,其中 0 代表黑色,255 代表白色(默认值是相反的)。解决这些问题:
使用示例(下图,取自此处)
结果:
更新
所以不需要使用
np.reshape()
,返回的结果escala_grises()
应该是一个列表的列表,这样它的每个元素都代表一行(元素的数量与原始图像中的列数一样多)。下面的代码实现了这个版本: