Kuliah · Photography · Software

Greyscale (Konversi RGB menjadi Greyscale)

Dalam fotografi dan komputasi, grayscale atau greyscale dari suatu gambar digital adalah gambar dimana nilai setiap pixel sampel tunggal, yang memiliki informasi intensitas. Gambar ini, yang juga dikenal sebagai hitam-putih, secara eksklusif terdiri dari warna abu-abu, bervariasi dari hitam di intensitas paling lemah sampai putih di intensitas terkuat. [Stephen Johnson (2006). Stephen Johnson on Digital Photography].

contoh gambar greyscale Padang Cement Indonesia.

Ada kasus bagaimana representasi nilai RGB (Red, Green, Blue) diubah menjadi gambar yang terdiri dari warna putih dan gradiasi warna hitam yang biasa disebut greyscale. Untuk mengubah RGB menjadi greyscale dapat digunakan rumus sebagai berikut:

greyscale = 0.299R + 0.587G + 0.114B .................... (1)

atau

greyscale = 0.333R + 0.333G + 0.333B .....................(2)

Perhitungan nilai greyscale yang sebenarnya adalah dengan menggunakan persamaan pertama. Untuk lebih mudah digunakan untuk perhitungan manual dan mudah diingat digunakan persamaan yang kedua.

Misal ada warna RGB dengan pixel 3043918. Bagaimana mengkonversi menjadi warna greyscale? Gunakan prinsip geser dan logika AND.

konversi nilai decimal 3043918 ke bilangan biner menjadi 1011100111001001001110. Kemudian lakukan proses AND 8 digit sehingga

1011100111001001001110
0000000000000011111111
-------------------------------------   AND
0000000000000001001110 = Red.

Kemudian untuk Green. Geser 8 kali ke kanan kemudian lakukan proses AND.

1011100111001001001110

Geser 8 Kali ke kanan

0000000010111001110010
0000000000000011111111
-------------------------------------    AND
0000000000000001110010 = Green

Kemudian untuk Blue. Geser 16 kali ke kanan kemudian lakukan proses AND.

1011100111001001001110
Geser 16 kali ke kanan

0000000000000000101110
0000000000000011111111
--------------------------------------     AND
0000000000000000101110 = Blue.

Logika konversi RGB menjadi greyscale dalam C++ Builder 6:

int px   = pixels[i][j];
int red  = px & 255;
int green=(px >> 8) & 255;
int blue =(px >> 16) & 255;
int grayscale = 0.299*red + 0.587*green + 0.114*blue;

Semoga membantu :)

20 thoughts on “Greyscale (Konversi RGB menjadi Greyscale)

  1. Malam mas sammy…
    Saya ingin membuat sebuah pogram sederhana. Yqng terdiri dari 2 proses utama
    1. konversi RGB ke grayscale
    2. konversi grayscale ke RGB

    Misalnya nilai RGB nya adalah (200.200.180)
    – untuk langkah pertama (konversi rgb ke grayscale) bisa kita gunakan rumusnya adalah 200+200+180/3 = 193. 193 adalah nilai piksel grayscale
    – sedangkan untuk proses 2 (konversi grayscale ke rgb) jika kita menggunakan rumus diatas “greyscale = 0.299R + 0.587G + 0.114B ……………….. (1)” hasilnya adalah
    R: 58 G: 113 B: 22

    Jika kita bandingkan RGB sebelum dikonversi dan setelah dikonversi nilainya terlalu jauh. nantinya akan berpengaruh ke gambar.
    sebelum dikoversi 200.200.180
    setelah dikonversi 58.113.22

    yang ingin sya tanyakan apakah ada cara lain untuk merubah nilai grayscale ke rgb?? atau hitung2an saya yang keliru mas???

    Thank sebelumnya

    1. Halo salam kenal mas rezky. Saya akan coba bantu. RGB itu 24 bit. Masing-masing Red, Green,Blue terdiri dari 8 bit
      misal, R=200 (11001000), G=200(11001000), B=180(10110100).
      Konversi RGB ke greyscale,
      greyscale = 0.299R + 0.587G + 0.114B
      greyscale = 0.299*200 + 0.587*200 + 0.114*180
      greyscale = 197.2

      Ada selisih sekitar 4 angka hasil dengan rumus greyscale = 0.333R + 0.333G + 0.333B
      hasilnya greyscale = 193.14. But, it’s not significant.

      Konversi greyscale ke RGB ? Jawabannya tidak bisa.
      Misal greyscale = 197.2
      greyscale = 0.299R + 0.587G + 0.114B

      Substitusi nilai 197.2 ke greyscale.
      197.2 = 0.299R + 0.587G + 0.114B. Berapa nilai R,G,B? Sulit mas. Saya belum pernah dapat junalnya mengenai algoritmanya. Kita tidak bisa tahu berapa nilai R, G, maupun B.

      Konversi dari greyscale ke RGB dan mendapatkan warna kembali, ada terlalu banyak nul. Perlu untuk memperkenalkan informasi lebih lanjut ke dalam gambar, karena telah kehilangan begitu banyak info gambar. Dari murni 8bit untuk 24bit perspektif, ada secara harfiah 2 ^ 16 kemungkinan untuk setiap pixel. Tapi, memang setahu saya belum bisa. Kita mau nyatakan gambar yang abu-abu jadi gambar yang ada merah, biru, dan hijau. Hm sukar sekali.

      Demikian. Semoga terbantu.

  2. bro, untuk mendapatkan nilai Red Green dan Blue itu dari mana ya ?
    tiba2 udah dapet 200, 200, 180 ?
    misal dari foto tau RGB nya dari mana ?

    Thanks

    1. Dear Mr. Yordan Utama,
      1. “Tangkap” 2 dimensi image (height dan weight)-yang sering disebut Pixel-dengan nested for:
      for(int i=0;iGetHeight();i++){
      for(int j=0;jGetWidth();j++){}
      }
      2. Di dalam nya gunakan algoritma preprocessor image. “Tangkap” pixelnya: gambar->GetPixels(i,j); //3043918
      3. Konversi dengan algoritma prinsip geser dan logika AND:
      int red = px & 255; //200
      int green=(px >> 8) & 255; //200
      int blue =(px >> 16) & 255; //180
      int grayscale = 0.299*red + 0.587*green + 0.114*blue;
      gambar->SetPixels(i,j,grayscale);

      Semoga membantu.

  3. mas boleh minta referensinya gak yg geser 8 digit itu? saya juga pake rumus itu tapi dosen saya malah bilang, “rumus darimana kayak gitu?” :(

    1. Hai, Dea. Salam kenal.
      Referensinya coba cari tentang Image Processing. Logika berpikirnya seperti begini.
      1. Mendapat 24-bit suatu warna (coba kunjungi https://en.wikipedia.org/wiki/Color_depth)
      2. 24-bit itu mau kita bagi 3: untuk Red, Green, Blue.
      ada yang membuat: geser 0 adalah Red, geser 8 adalah Green, geser 16 adalah Blue.
      ada yang membuat: geser 0 adalah Blue, geser 8 adalah Green, geser 16 adalah Red.
      Sama saja. Intinya kita mau buat 3 warna dari 1011100111001001001110 (contoh di atas).
      xxxxxxxx – xxxxxxxx – xxxxxxxx
      red – green – blue
      Tentu untuk red, tidak usah digeser. Untuk green, geser ke kanan sebanyak 8. Untuk blue, geser 16. Simple kok. Kemudian jangan lupa di ‘and’-kan dengan 255. :)

      1. oh ya gan,,,
        jika RGB(70,20,100) perbandingannya lumayan lo untuk persamaan 1 sama 2…
        apakah masih bisa digunakan? tank’s

  4. misi mautanya misalkan Resize pixel 320*320 mau mengetahui nilai Grayscale gimna ya masalahnya ane blum paham bngeut euy makasih sebelumnya

    1. Basically mas harus punya knowledge Image Processing.
      1.Buat segmentasi citra. Akhir dari step ini berdasarkan posisi 2 dimensi, didapatkan pixel.
      2.Buat threshold. Pixel di no1 tadi dibuat thresholdnya. Misal jika <128, maka 0. Otherwise 255. inilah nilai RGB
      3.Buat preprocessor grayscale. nilai RGB di no2, dikonversi ke nilai grayscalenya dengan menggunakan rumus yang ada post-page ini.

      Demikian Gan Hamdani. Sukses. :)

    1. Untuk mempelajari ini, agan harus mempelajari Mata kuliah Image Processing. Butuh waktu untuk mempelajari rumusnya. Karena harus menyamakan persepsi manusia dan mesin dalam memaknai arti warna. Anda bisa merujuk ke Journal ilmiah yang valid. Untuk level kuliah bachelor degree, Anda tidak dituntut untuk mengetahui “dari mana rumus ini lahir?” Tapi untuk sekadar referensi, sillahkan singgah di perpustakaan, journal ilmiah, atau ask your expert/superior.

    1. Hai Nia, terimakasih sudah berkunjung

      Untuk mengonversi nilai RGB (Red, Green, Blue) ke skala abu-abu (grayscale), Kamu dapat menggunakan rumus yang sederhana. Pada skala abu-abu, intensitas warna setiap piksel diwakili oleh tingkat keabuan tunggal. Berikut adalah rumus umum yang dapat Kamu gunakan:

      Grayscale = (0.299 * R) + (0.587 * G) + (0.114 * B)

      Di mana R, G, dan B adalah nilai intensitas warna merah, hijau, dan biru masing-masing, dengan rentang nilai antara 0 hingga 255. Setelah menghitung nilai skala abu-abu, Kamu bisa menggunakan nilai yang sama untuk ketiga saluran warna (R, G, B) untuk mendapatkan citra skala abu-abu.

      Gimana mendapat nilai R, G, atau B? Contoh red / merah

      Untuk mendapatkan nilai intensitas warna merah (R) dari sebuah piksel dalam format RGB, Kamu dapat menggunakan notasi array atau struktur data yang menyimpan nilai-nilai untuk masing-masing saluran warna.

      Jika Kamu memiliki representasi RGB sebagai sebuah array dengan panjang tiga (misalnya, [R, G, B]), maka nilai intensitas warna merah dapat diakses dengan mengambil elemen pertama dari array tersebut (R = array[0]).

      Jika Kamu memiliki representasi RGB sebagai sebuah struktur data dengan properti yang sesuai untuk masing-masing saluran warna, Kamu dapat mengakses nilai intensitas warna merah dengan mengambil nilai properti yang berkaitan dengan saluran warna merah.

      Misalnya, jika Kamu memiliki objek pixel dengan properti red, green, dan blue, Anda dapat mengakses nilai intensitas warna merah dengan R = pixel.red.

      Penting untuk diingat bahwa dalam format RGB, nilai intensitas warna merah biasanya berada dalam rentang 0 hingga 255, di mana 0 mewakili tidak ada warna merah (hitam) dan 255 mewakili intensitas warna merah maksimum.

Leave a comment