Find If Image Is Bright Or Dark

11,585

Solution 1

You could try this :

import imageio
import numpy as np

f = imageio.imread(filename, as_gray=True)

def img_estim(img, thrshld):
    is_light = np.mean(img) > thrshld
    return 'light' if is_light else 'dark'

print(img_estim(f, 127))

Solution 2

You could try this, considering image is a grayscale image -

blur = cv2.blur(image, (5, 5))  # With kernel size depending upon image size
if cv2.mean(blur) > 127:  # The range for a pixel's value in grayscale is (0-255), 127 lies midway
    return 'light' # (127 - 255) denotes light image
else:
    return 'dark' # (0 - 127) denotes dark image

Refer to these -
Smoothing, Mean, Thresholding

Solution 3

Personally, I would not bother writing any Python, or loading up OpenCV for such a simple operation. If you absolutely have to use Python, please just disregard this answer and select a different one.

You can just use ImageMagick at the command-line in your Terminal to get the mean brightness of an image as a percentage, where 100 means "fully white" and 0 means "fully black", like this:

convert someImage.jpg -format "%[fx:int(mean*100)]" info:

Alternatively, you can use libvips which is less common, but very fast and very lightweight:

vips avg someImage.png

The vips answer is on a scale of 0..255 for 8-bit images.

Note that both these methods will work for many image types, from PNG, through GIF, JPEG and TIFF.

Share:
11,585
Admin
Author by

Admin

Updated on June 19, 2022

Comments

  • Admin
    Admin about 2 years

    I would like to know how to write a function in Python 3 using OpenCV which takes in an image and a threshold and returns either 'dark' or 'light' after heavily blurring it and reducing quality (faster the better). This might sound vague , but anything that just works will do.