276

matplotlibRGB画像を読み込んでグレースケールに変換しようとしています。

matlab では、これを使用します。

img = rgb2gray(imread('image.png'));

matplotlib チュートリアルでは、彼らはそれをカバーしていません。彼らはただ画像を読んだだけです

import matplotlib.image as mpimg
img = mpimg.imread('image.png')

次に、配列をスライスしますが、それは私が理解しているRGBをグレースケールに変換することと同じではありません。

lum_img = img[:,:,0]

numpy または matplotlib に、RGB からグレーに変換する組み込み関数がないとは信じがたいです。これは画像処理ではよくある操作ではないでしょうか。

imread5分でインポートされた画像で動作する非常に単純な関数を書きました。それは恐ろしく非効率的ですが、それが私が組み込みの専門的な実装を望んでいた理由です。

Sebastian は私の機能を改善してくれましたが、まだ組み込み機能を見つけたいと思っています。

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
4

14 に答える 14

402

Pillowでそれを行うのはどうですか:

from PIL import Image
img = Image.open('image.png').convert('L')
img.save('greyscale.png')

入力画像にアルファ (透明度) チャネルが存在し、保持する必要がある場合は、 mode を使用しますLA

img = Image.open('image.png').convert('LA')

matplotlib と式の使用

Y' = 0.2989 R + 0.5870 G + 0.1140 B 

あなたができる:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [0.2989, 0.5870, 0.1140])

img = mpimg.imread('image.png')     
gray = rgb2gray(img)    
plt.imshow(gray, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
plt.show()
于 2012-08-30T16:48:29.157 に答える
12

チュートリアルは、RGB でエンコードされたグレースケール画像から開始しているため、ごまかしています。そのため、単一のカラー チャネルをスライスしてグレースケールとして扱っているだけです。必要な基本的な手順は、RGB 色空間から、YUV/YIQ や HSL/HSV などの輝度/彩度モデルに近似するものでエンコードする色空間に変換し、輝度のようなチャネルを切り取り、それを次のように使用することです。あなたのグレースケール画像。 matplotlibYUV/YIQ に変換するメカニズムを提供していないように見えますが、HSV に変換できます。

matplotlib.colors.rgb_to_hsv(img)使用してから、グレースケールの配列から最後の値 (V) をスライスしてみてください。これは輝度値とまったく同じではありませんが、 ですべて実行できることを意味しますmatplotlib

バックグラウンド:

または、PIL またはビルトインcolorsys.rgb_to_yiq()を使用して、真の輝度値を持つ色空間に変換することもできます。オールインして独自の輝度専用コンバーターをロールインすることもできますが、それはおそらくやり過ぎです。

于 2012-08-30T17:11:52.003 に答える
5

img.Convert()を使用し、「L」「RGB」「CMYK」に対応。モード

import numpy as np
from PIL import Image

img = Image.open("IMG/center_2018_02_03_00_34_32_784.jpg")
img.convert('L')

print np.array(img)

出力:

[[135 123 134 ...,  30   3  14]
 [137 130 137 ...,   9  20  13]
 [170 177 183 ...,  14  10 250]
 ..., 
 [112  99  91 ...,  90  88  80]
 [ 95 103 111 ..., 102  85 103]
 [112  96  86 ..., 182 148 114]]
于 2018-02-03T07:19:19.767 に答える
-3
image=myCamera.getImage().crop(xx,xx,xx,xx).scale(xx,xx).greyscale()

greyscale()変換に直接使用できます。

于 2016-03-16T08:35:51.013 に答える