Saya mencoba menggunakan matplotlib
untuk membaca dalam gambar RGB dan mengubahnya menjadi skala abu-abu.
Di matlab saya menggunakan ini:
img = rgb2gray(imread('image.png'));
Dalam tutorial matplotlib mereka tidak membahasnya. Mereka baru saja membaca gambar
import matplotlib.image as mpimg
img = mpimg.imread('image.png')
dan kemudian mereka mengiris array, tapi itu tidak sama dengan mengubah RGB menjadi grayscale dari apa yang saya mengerti.
lum_img = img[:,:,0]
Saya merasa sulit untuk percaya bahwa numpy atau matplotlib tidak memiliki fungsi bawaan untuk mengkonversi dari rgb ke grey. Bukankah ini operasi yang umum dalam pemrosesan gambar?
Saya menulis fungsi yang sangat sederhana yang berfungsi dengan gambar yang diimpor menggunakan imread
dalam 5 menit. Ini sangat tidak efisien, tapi itu sebabnya saya berharap untuk implementasi profesional built-in.
Sebastian telah meningkatkan fungsi saya, tetapi saya masih berharap untuk menemukan yang built-in.
implementasi 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
sumber
gray = np.mean(rgb, -1)
. Mungkinrgb[...,:3]
ada jika itu sebenarnya rgba.gray = np.mean(rgb, -1)
berfungsi dengan baik. Terima kasih. Apakah ada alasan untuk tidak menggunakan ini? Mengapa saya menggunakan solusi dalam jawaban di bawah?np.mean(rgb, -1)
.0.2989 * R + 0.5870 * G + 0.1140 * B
Saya berasumsi bahwa itu adalah cara standar untuk melakukannya.Jawaban:
Bagaimana kalau melakukannya dengan Bantal :
Menggunakan matplotlib dan formula
Anda bisa melakukan:
sumber
matplotlib
untuk beberapa alasan lain, dia harus dapat menggunakan builtincolorsys.rgb_to_yiq()
untuk mengubah dan sepotong untuk mendapatkan hanya saluran luma..convert('LA')
? mengapa tidak.convert('gray')
? Tampak samar samar. The dokumentasi PIL tidak menyebutkan apa-apa tentang 'LA' untuk mengkonversi fungsi.cannot write mode LA as JPEG
img = Image.open('image.png').convert('LA')
harusimg = Image.open('image.png').convert('L')
LA
mode memiliki luminositas (kecerahan) dan alfa. Jika Anda menggunakanLA
mode, makagreyscale.png
akan menjadi gambar RGBA dengan saluran alfaimage.png
dipertahankan. Jika Anda menggunakanL
mode, makagreyscale.png
akan menjadi gambar RGB (tanpa alfa).Anda juga dapat menggunakan scikit-image , yang menyediakan beberapa fungsi untuk mengkonversi gambar
ndarray
, sepertirgb2gray
.Catatan : Bobot yang digunakan dalam konversi ini dikalibrasi untuk fosfor CRT kontemporer: Y = 0,2125 R + 0,7154 G + 0,0721 B
Atau, Anda dapat membaca gambar dalam skala abu-abu dengan:
sumber
cmap
sebagaigray' then only the image is shown as gray in
pyplot.imshow () `? Adakah pikiran? Dimana saya salahTiga dari metode yang disarankan diuji untuk kecepatan dengan 1000 gambar RGBA PNG (224 x 256 piksel) berjalan dengan Python 3.5 pada Ubuntu 16,04 LTS (Xeon E5 2670 dengan SSD).
Waktu lari rata-rata
pil :
1,037 detikscipy:
1,040 detiksk :
2,120 detikPIL dan SciPy memberikan
numpy
array yang identik (mulai dari 0 hingga 255). SkImage memberikan array dari 0 hingga 1. Selain itu, warna-warna tersebut dikonversi sedikit berbeda, lihat contoh dari dataset CUB-200.SkImage:
PIL :
SciPy :
Original:
Diff :
Kode
Performa
sumber
Anda selalu dapat membaca file gambar sebagai skala abu-abu sejak awal menggunakan
imread
dari OpenCV:Lebih jauh, jika Anda ingin membaca gambar sebagai RGB, lakukan pemrosesan dan kemudian konversikan ke Skala Abu-abu yang dapat Anda gunakan
cvtcolor
dari OpenCV:sumber
0
Bendera adalahcv2.CV_LOAD_IMAGE_GRAYSCALE
.Cara tercepat dan saat ini adalah menggunakan Bantal , dipasang melalui
pip install Pillow
.Kodenya adalah:
sumber
convert
mengembalikan salinan gambar yang dikonversiTutorial ini curang karena dimulai dengan gambar skala abu-abu yang dikodekan dalam RGB, sehingga mereka hanya memotong satu saluran warna dan memperlakukannya sebagai skala abu-abu. Langkah-langkah dasar yang perlu Anda lakukan adalah mengubah dari ruang warna RGB ke ruang warna yang mengkodekan dengan sesuatu yang mendekati model luma / chroma, seperti YUV / YIQ atau HSL / HSV, kemudian memotong saluran seperti luma dan menggunakannya sebagai gambar skala abu-abu Anda.
matplotlib
tampaknya tidak menyediakan mekanisme untuk mengonversi ke YUV / YIQ, tetapi ia memungkinkan Anda mengonversi ke HSV.Coba gunakan
matplotlib.colors.rgb_to_hsv(img)
kemudian mengiris nilai terakhir (V) dari array untuk skala abu-abu Anda. Ini tidak sama dengan nilai luma, tetapi itu berarti Anda dapat melakukan semuanyamatplotlib
.Latar Belakang:
Atau, Anda bisa menggunakan PIL atau builtin
colorsys.rgb_to_yiq()
untuk mengonversi ke ruang warna dengan nilai luma yang sebenarnya. Anda juga dapat masuk dan memutar konverter hanya-luma Anda sendiri, meskipun itu mungkin berlebihan.sumber
Menggunakan rumus ini
Kita bisa
Namun, konversi warna GIMP ke perangkat lunak gambar grayscale memiliki tiga algoritma untuk melakukan tugas tersebut.
sumber
Jika Anda sudah menggunakan NumPy / SciPy, Anda sebaiknya menggunakan :
scipy.ndimage.imread(file_name, mode='L')
sumber
scipy.ndimage.imread()
danscipy.misc.imread()
secara resmi ditinggalkan dalam SciPy 1.0.0 dan akan dihapus secara permanen di SciPy 1.2.0. Meskipun dokumentasi SciPy merekomendasikanimageio.imread()
sebagai pengganti yang sesuai, API fungsi ini adalah tulang belulang sampai titik absurditas. Ini tidak memberikan dukungan untuk konversi skala abu-abu dan dengan demikian tetap tidak cocok untuk banyak aplikasi - termasuk kami.</sigh>
Anda bisa melakukan:
sumber
Gunakan img.Convert (), mendukung "L", "RGB" dan "CMYK." mode
Keluaran:
sumber
img = img.convert('L')
?Saya sampai pada pertanyaan ini melalui Google, mencari cara untuk mengkonversi gambar yang sudah dimuat ke skala abu-abu.
Ini cara untuk melakukannya dengan SciPy:
sumber
img_gray = numpy.average(img, weights=[0.299, 0.587, 0.114], axis=2)
numpy.average
sedikit lebih cepat tetapi tidak berbeda. Solusi Anda jelas dan memiliki informasi yang relevan tentang R, G, B, jadi saya akan menyimpannya. Komentar saya lebih merupakan opsi tambahan, bukan pengganti.scipy.ndimage.imread()
danscipy.misc.imread()
secara resmi ditinggalkan dalam SciPy 1.0.0 dan akan dihapus secara permanen di SciPy 1.2.0. Anda mungkin hanya ingin menggunakan dukungan konversi builtin grayscale Bantal ini (ala unutbu 's jawaban ), sebagai gantinya.Anda dapat menggunakan
greyscale()
langsung untuk transformasi.sumber