import cv2
import numpy
def deltae(color1, color2, maxCount=255):
"""
title::
deltae
description::
This method will compute the color difference (delta E) between
two provided colors triplets or two provided color images. The
colors provided are assumed to be in sRGB color space and viewed
under illuminant D65. If the provided colors are individual color
triplets, the return value will be a scalar delta E. If the provided
colors are images, a delta E image and a scalar average delta E will
be returned as a tuple.
attributes::
color1
A color triplet [B,G,R] in an array-like object or an image
in a numpy.ndarray.
color2
A color triplet [B,G,R] in an array-like object or an image
in a numpy.ndarray.
maxCount
The maximum digital count value that might be contained in the
color triplets or the provide color images (this is not
necessarily the maximum value in the provided colors, but
rather it is the largest value that any component of the colors
might take on).
author::
Carl Salvaggio
copyright::
Copyright (C) 2015, Rochester Institute of Technology
license::
GPL
version::
1.0.0
disclaimer::
This source code is provided "as is" and without warranties as to
performance or merchantability. The author and/or distributors of
this source code may have made statements about this source code.
Any such statements do not constitute warranties and shall not be
relied on by the user in deciding whether to use this source code.
This source code is provided without any express or implied warranties
whatsoever. Because of the diversity of conditions and hardware under
which this source code may be used, no warranty of fitness for a
particular purpose is offered. The user is advised to test the source
code thoroughly before relying on it. The user must assume the entire
risk of using the source code.
"""
# Make sure that the provided colors are numpy ndarrays, if not
# convert them
if type(color1).__module__ != numpy.__name__:
c1 = numpy.asarray(color1)
else:
c1 = color1
if type(color2).__module__ != numpy.__name__:
c2 = numpy.asarray(color2)
else:
c2 = color2
# Convert the provided colors to single-precision floating-point
# values in the range [0,1] for computation
c1 = c1.astype(numpy.float32) / maxCount
c2 = c2.astype(numpy.float32) / maxCount
# Check that the dimensional shape of the provided colors are the same
dimensions1 = numpy.shape(c1)
dimensions2 = numpy.shape(c2)
if dimensions1 != dimensions2:
raise ValueError('Provided datasets must have the same shape')
# Make sure the provided colors are presented as an image to the color
# conversion routine
if len(dimensions1) == 1 and dimensions1[-1] == 3:
c1 = numpy.asarray(c1).reshape((1,1,3))
c2 = numpy.asarray(c2).reshape((1,1,3))
elif len(dimensions1) != 3 or dimensions1[-1] != 3:
msg = 'Provided colors must be either a 3-element vector or 3xn array'
raise ValueError(msg)
# Convert provided sRGB colors to L*a*b* space
lab1 = cv2.cvtColor(c1, cv2.COLOR_BGR2LAB)
lab2 = cv2.cvtColor(c2, cv2.COLOR_BGR2LAB)
# Compute the delta E for each of the provided color pairs
dE = numpy.sqrt(numpy.sum((lab1 - lab2)**2, -1))
# Return the delta E image and the average delta E value -or- the scalar
# delta E for a pair of provided color triplets
if dE.size == 1:
return float(dE[0, 0])
else:
return dE, float(numpy.mean(dE))