Хотя я не могу точно сказать, что это будет наиболее эффективным, я уверен, что он будет работать лучше, чем большинство операций.
Итак, рассмотрите возможность использования модуля ImageStat.
from PIL import Image, ImageStat
def is_grayscale(path="image.jpg")
im = Image.open(path).convert("RGB")
stat = ImageStat.Stat(im)
if sum(stat.sum)/3 == stat.sum[0]: #check the avg with any element value
return True #if grayscale
else:
return False #else its colour
stat.sum дает нам сумму всех пикселей в виде списка = [R, G, B], например [568283302.0, 565746890.0, 559724236.0]. Для изображения в градациях серого все элементы списка равны.