# How to make an image more vibrant in colour using OpenCV?

I need to enhance few of the images before processing them. I need to enhance their colour.

I found a post online that shows how to determine how colour an image actually is.

Computing image “colorfulness” with OpenCV and Python

Code

def image_colorfulness(image):
# split the image into its respective RGB components
(B, G, R) = cv2.split(image.astype("float"))

# compute rg = R - G
rg = np.absolute(R - G)

# compute yb = 0.5 * (R + G) - B
yb = np.absolute(0.5 * (R + G) - B)

# compute the mean and standard deviation of both rg and yb
(rbMean, rbStd) = (np.mean(rg), np.std(rg))
(ybMean, ybStd) = (np.mean(yb), np.std(yb))

# combine the mean and standard deviations
stdRoot = np.sqrt((rbStd ** 2) + (ybStd ** 2))
meanRoot = np.sqrt((rbMean ** 2) + (ybMean ** 2))

# derive the "colorfulness" metric and return it
return stdRoot + (0.3 * meanRoot)


For my application the threshold value seems to be 24.00 lesser than this I need to enhance the colour for my application to work properly

I used Gimp tool to enhance the colour

Reduce curve for the colour to be more enhanced

How can I enhance colour of an image in a similar manner using OpenCV?

edit retag close merge delete

Sort by » oldest newest most voted

Found this link how to enhance the red, green and blue color within an image? altering the saturation channel of the HSV colour space

I even need to reduce the brightness so I even had to alter the value channel of the HSV colourspace

Code

hsvImg = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)

#multiple by a factor to change the saturation
hsvImg[...,1] = hsvImg[...,1]*1.4

#multiple by a factor of less than 1 to reduce the brightness
hsvImg[...,2] = hsvImg[...,2]*0.6

image=cv2.cvtColor(hsvImg,cv2.COLOR_HSV2BGR)

more

gimp is open source,and i get some color from it before

.... //enhance the color

    Mat Img_out(temp.size(), CV_32FC3);
temp.convertTo(Img_out, CV_32FC3);
Mat Img_in(temp.size(), CV_32FC3);
temp.convertTo(Img_in, CV_32FC3);
// define the iterator of the input image
MatIterator_<Vec3f> inp_begin, inp_end;
inp_begin=Img_in.begin<Vec3f>();
inp_end =Img_in.end<Vec3f>();
// define the iterator of the output image
MatIterator_<Vec3f> out_begin, out_end;
out_begin=Img_out.begin<Vec3f>();
out_end =Img_out.end<Vec3f>();
// increment (-100.0, 100.0)
float delta=0;
float minVal, maxVal;
float t1, t2, t3;
float L,S;
float alpha;
for(; inp_begin!=inp_end; inp_begin++, out_begin++)
{
t1=(*inp_begin)[0];
t2=(*inp_begin)[1];
t3=(*inp_begin)[2];
minVal=std::min(std::min(t1,t2),t3);
maxVal=std::max(std::max(t1,t2),t3);
delta=(maxVal-minVal)/255.0;
L=0.5*(maxVal+minVal)/255.0;
S=std::max(0.5*delta/L, 0.5*delta/(1-L));
if (Increment>0)
{
alpha=max(S, 1-Increment);
alpha=1.0/alpha-1;
(*out_begin)[0]=(*inp_begin)[0]+((*inp_begin)[0]-L*255.0)*alpha;
(*out_begin)[1]=(*inp_begin)[1]+((*inp_begin)[1]-L*255.0)*alpha;
(*out_begin)[2]=(*inp_begin)[2]+((*inp_begin)[2]-L*255.0)*alpha;
}
else
{
alpha=Increment;
(*out_begin)[0]=L*255.0+((*inp_begin)[0]-L*255.0)*(1+alpha);
(*out_begin)[1]=L*255.0+((*inp_begin)[1]-L*255.0)*(1+alpha);
(*out_begin)[2]=L*255.0+((*inp_begin)[2]-L*255.0)*(1+alpha);
}
}
Img_out /=255;
Img_out.convertTo(matDst,CV_8UC3,255);


the reuslt is sth like this:

more

Official site

GitHub

Wiki

Documentation