tatoline
tatoline

Reputation: 875

Converting RGB Image to Grayscale by Manually in Python (without using external libraries)

I sum each pixel's Red, Green and Blue values and divide the sum by 3:

gray_image = (image[:,:,0] + image[:,:,1] + image[:,:,2]) / 3

This is what I got:

My code is:

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

def rgb2gray(image):
    imageHeight = len(image)
    imageWidth = len(image[0])
    grayImage = np.empty([imageHeight, imageWidth], dtype=np.uint8)

    for i in range(imageHeight):
        for j in range(imageWidth):
            grayImage[i][j] = int((image[i][j][0] + image[i][j][1] + image[i][j][2]) / 3)
    return grayImage


class RetargetedImage:
    imageDirectory = ""
    image = None
    grayImage = None

    def __init__(self, imageDirectory):
        self.imageDirectory = imageDirectory
        self.image = pltim.imread(self.imageDirectory)
        self.grayImage = rgb2gray(self.image)

    def showOriginalImage(self):
        plt.imshow(self.image)
        plt.show()

    def showGrayImage(self):
        plt.imshow(self.grayImage)
        plt.show()


example1 = RetargetedImage("treeMedium.jpg")
example1.showGrayImage()

And this is the original image:

Where am I doing wrong?

Upvotes: 0

Views: 4821

Answers (2)

Filippo Grazioli
Filippo Grazioli

Reputation: 385

Here is the documentation of the imshow method

The input may either be actual RGB(A) data, or 2D scalar data, which will be rendered as a pseudocolor image. Note: For actually displaying a grayscale image set up the color mapping using the parameters cmap='gray', vmin=0, vmax=255

To visualize the image in grayscale:

def showGrayImage(self):
    plt.imshow(self.grayImage, cmap='gray', vmin=0, vmax=255)
    plt.show()

Concerning line:

grayImage[i][j] = int((image[i][j][0] + image[i][j][1] + image[i][j][2]) / 3)

You are missing the three weighting coefficients for the R, G and B channels, as explained here on Wikipedia.

Y ← 0.299⋅R+0.587⋅G+0.114⋅B

Upvotes: 2

mamroure
mamroure

Reputation: 85

to convert from rgb to grayscale use gray = 0.2126 * red + 0.7152 * green + 0.0722 * blue

can you post the output

for i in range(imageHeight):
        for j in range(imageWidth):
            grayImage[i][j] = int(image[i][j][0]*0.2126 + image[i][j][1]*0.7152 + image[i][j][2] * 0.0722)
    return grayImage

Upvotes: 0

Related Questions