Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting an image to grayscale using numpy

I have an image represented by a numpy.array matrix nxm of triples (r,g,b) and I want to convert it into grayscale, , using my own function.

My attempts fail converting the matrix nxmx3 to a matrix of single values nxm, meaning that starting from an array [r,g,b] I get [gray, gray, gray] but I need gray.

i.e. Initial colour channel : [150 246 98]. After converting to gray : [134 134 134]. What I need : 134

How can I achieve that?

My code:

def grayConversion(image):
    height, width, channel = image.shape
    for i in range(0, height):
        for j in range(0, width):
            blueComponent = image[i][j][0]
            greenComponent = image[i][j][1]
            redComponent = image[i][j][2]
            grayValue = 0.07 * blueComponent + 0.72 * greenComponent + 0.21 * redComponent
            image[i][j] = grayValue
    cv2.imshow("GrayScale",image)
    return image
like image 591
thesamiroli Avatar asked Mar 05 '23 20:03

thesamiroli


2 Answers

Here is a working code:

def grayConversion(image):
    grayValue = 0.07 * image[:,:,2] + 0.72 * image[:,:,1] + 0.21 * image[:,:,0]
    gray_img = grayValue.astype(np.uint8)
    return gray_img

orig = cv2.imread(r'C:\Users\Jackson\Desktop\drum.png', 1)
g = grayConversion(orig)

cv2.imshow("Original", orig)
cv2.imshow("GrayScale", g)
cv2.waitKey(0)
cv2.destroyAllWindows()
like image 187
Jeru Luke Avatar answered Mar 15 '23 04:03

Jeru Luke


You can use a dot product:

gray_image = image.dot([0.07, 0.72, 0.21])

Or even just do the whole operation manually:

b = image[..., 0]
g = image[..., 1]
r = image[..., 2]
gray_image = 0.21 * r + 0.72 * g + 0.07 * b

Don't forget to convert back to 0-255:

gray_image = np.min(gray_image, 255).astype(np.uint8)
like image 23
Eric Avatar answered Mar 15 '23 04:03

Eric