Estou tentando usar matplotlib
para ler uma imagem RGB e convertê-la em escala de cinza.
No matlab eu uso isso:
img = rgb2gray(imread('image.png'));
No tutorial matplotlib, eles não abordam isso. Eles apenas lêem na imagem
import matplotlib.image as mpimg
img = mpimg.imread('image.png')
e eles dividem a matriz, mas isso não é o mesmo que converter RGB em escala de cinza do que eu entendo.
lum_img = img[:,:,0]
Acho difícil acreditar que numpy ou matplotlib não tenha uma função integrada para converter de rgb para cinza. Isso não é uma operação comum no processamento de imagens?
Eu escrevi uma função muito simples que funciona com a imagem importada usando imread
em 5 minutos. É terrivelmente ineficiente, mas é por isso que eu esperava uma implementação profissional integrada.
Sebastian melhorou minha função, mas ainda espero encontrar a incorporada.
implementação do matlab (NTSC / PAL):
import numpy as np
def rgb2gray(rgb):
r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
return gray
gray = np.mean(rgb, -1)
funciona bem. obrigado. Existe alguma razão para não usar isso? Por que eu usaria as soluções nas respostas abaixo?
np.mean(rgb, -1)
.
0.2989 * R + 0.5870 * G + 0.1140 * B
Estou assumindo que é a maneira padrão de fazê-lo.
gray = np.mean(rgb, -1)
. Talvezrgb[...,:3]
exista se for realmente rgba.