Anda di halaman 1dari 5

Grayscale

Citra grayscale adalah citra yang terdiri dari kumpulan warna-warna grayscale, tanpa komponen warna
murni. Dengan menggunakan kedalaman warna 1 byte, maka terdapat 256 level tingkat grayscale, dari
nilai 0 sebagai nilai terendah(gelap/hitam) menuju nilai 255 sebagai nilai tertinggi(terang/putih)
Setiap citra berwarna dapat dikonversi menjadi citra greyscale. Untuk menghasilkan citra greyscale dari
citra berwarna pada dasarnya cukup mudah, karena komponen greyscale akan dihasilkan dengan
menyamakan nilai komponen R, G dan B dari sebuah citra RGB untuk setiap pixel citra. Ada sejumlah
cara untuk mengkonversi komponen R, G, B menjadi komponen graycsale.
Nilai R(R,G,B)
Nilai G(R,G,B)
Nilai B(R,G,B)
Nilai maksimum(R,G,B)
Nilai minimum(R,G,B)
Nilai rata-rata(R,G,B)
Nilai Luminance = (maksimum(R,G,B) + minimum(R,G,B))/2

Namun nilai konversi mana yang paling sesuai, perlu disesuaikan dengan kepekaan mata manusia
terhadap 3 komponen warna dasar R,G,B . Oleh sebab itu penelitian lebih lanjut menghasilkan sejumlah
nilai konversi.

BT 709 = 0.2126*R + 0.7152*G + 0.0722*B
BT 601 = 0.299*R + 0.587*G + 0.114*B

Berikut adalah contoh program untuk menghasilkan konversi grayscale dengan nilai R(R,G,B) dan nilai
Maksimum(R,G,B) :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define CREATOR "PTIK"
#define RGB_COMPONENT_COLOR 255

typedef struct {
unsigned char red;
unsigned char green;
unsigned char blue;
}RGB;

typedef struct {
int width;
int height;
RGB **pixel;
}Image;

typedef struct{
float Hue;
float Saturation;
int Value;
}HSV;

static Image *readPPM(const char *filename){
char buff[16];
int i,j;
Image *img;
FILE *fp;
int c, rgb_comp_color;
//open PPM file for reading
fp = fopen(filename, "rb");
if (!fp) {
fprintf(stderr, "File tidak dapat dibuka '%s'\n", filename);
exit(1);
}
//read image format
if (!fgets(buff, sizeof(buff), fp)) {
perror(filename);
exit(1);
}

//check the image format
if (buff[0] != 'P' || buff[1] != '6') {
fprintf(stderr, "Image bukan PPM versi P6\n");
exit(1);
}

//alloc memory form image
img = (Image *)malloc(sizeof(Image));
if (!img) {
fprintf(stderr, "Unable to allocate memory\n");
exit(1);
}

//check for comments
c = getc(fp);
while (c == '#') {
while (getc(fp) != '\n') ;
c = getc(fp);
}

ungetc(c, fp);
//read image size information
if (fscanf(fp, "%d %d", &img->width, &img->height) != 2) {
fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
exit(1);
}

//read rgb component
if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
exit(1);
}

//check rgb component depth
if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
fprintf(stderr, "'%s' does not have 8-bits components\n", filename);
exit(1);
}
//while (fgetc(fp) != '\n') ;
img->pixel=(RGB**)malloc(img->height * sizeof(RGB*));
for (i = 0; i < img->height; i++) {
img->pixel[i] = (RGB*)malloc(img->width * sizeof(RGB));
}
c = getc(fp);
for(i=0;i<img->height;i++){
for(j=0;j<img->width;j++){
c = getc(fp);
img->pixel[i][j].red=(unsigned char)c;
c = getc(fp);
img->pixel[i][j].green=(unsigned char)c;
c = getc(fp);
img->pixel[i][j].blue=(unsigned char)c;
}
}
fclose(fp);
return img;
}

void writePPM(const char *filename, Image *img)
{
int i,j,k;
FILE *fp;
//open file for output
fp = fopen(filename, "wb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}

//write the header file
//image format
fprintf(fp, "P6\n");
//comments
fprintf(fp, "# Created by %s\n",CREATOR);
//image size
fprintf(fp, "%d %d\n",img->width,img->height);
//jumlah warna
fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);
for(i=0;i<img->height;i++){
for(j=0;j<img->width;j++){
fprintf(fp, "%c",img->pixel[i][j].red);
fprintf(fp, "%c",img->pixel[i][j].green);
fprintf(fp, "%c",img->pixel[i][j].blue);
}
}
fclose(fp);
}

void GRed(Image *img)
{
int i,j;
if(img){
for(i=0;i<img->height;i++){
for(j=0;j<img->width;j++){
img->pixel[i][j].red= img->pixel[i][j].red;
img->pixel[i][j].green=img->pixel[i][j].red;;
img->pixel[i][j].blue=img->pixel[i][j].red;;
}
}
}
}

int max3(int a,int b, int c){
if((a>=b)&&(a>=c)){
return a;
}else if(b>=c){
return b;
}else{
return c;
}
}

void GrayMax(Image *img){
int i,j,t;
int gray;
if(img){
for(i=0;i<img->height;i++){
for(j=0;j<img->width;j++){
gray=max3(img->pixel[i][j].red,img->pixel[i][j].green,img-
>pixel[i][j].blue);
img->pixel[i][j].red = gray;
img->pixel[i][j].green = gray;
img->pixel[i][j].blue = gray;
}
}
}
}


main(){
Image *Sumber;
int i,j;
char filename[40];
strcpy(filename,"flower.ppm");

/* Red channel*/
Sumber = readPPM(filename);
GRed(Sumber);
writePPM("GRed.ppm",Sumber);
printf("OK Red channel\n");

/*Gray Max*/
Sumber = readPPM(filename);
GrayMax(Sumber);
writePPM("GMax.ppm",Sumber);
printf("OK Gray max\n");

}

Gambar Asli :


Hasil R(R,G,B)


Hasil Max(R,G,B)


Tugas :
Lengkapi Program untuk menghasilkan citra-citra dari teknik-teknik konversi diatas. Gunakan gambar
anda sendiri. Dan pilih salah satu hasil konversi yang menurut anda paling tepat.

Anda mungkin juga menyukai