接上篇博文中的RGB颜色模型转换为HSI颜色模型,做了消除红眼的算法。
基本的算法描述如下:
代码:
#include "opencv_libs.h"
#include <highgui.h>
#include <cv.h>
#include <math.h>
/*
* 描述:基于HSI颜色模型消除红眼
* 作者:qdsclove(qdsclove@gmail.com)
* 时间:22:49 4/18 星期四 2013
*/
/* 鼠标选择的矩形 */
CvRect rect;
/* 标记是否在画 */
bool draw = false;
/* 确定下来的眼睛矩形 */
CvRect eyeRect;
/* 是否选定眼睛区域 */
bool isFinalRect = false;
IplImage* img;
IplImage* temp;
IplImage* original;
// 将HSI颜色空间的三个分量组合起来,便于显示
IplImage* catHSImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I)
{
IplImage* HSI_Image = cvCreateImage( cvGetSize( HSI_H ), IPL_DEPTH_8U, 3 );
for(int i = 0; i < HSI_Image->height; i++)
{
for(int j = 0; j < HSI_Image->width; j++)
{
double d = cvmGet( HSI_H, i, j );
int b = (int)(d * 255/360);
d = cvmGet( HSI_S, i, j );
int g = (int)( d * 255 );
d = cvmGet( HSI_I, i, j );
int r = (int)( d * 255 );
cvSet2D( HSI_Image, i, j, cvScalar( b, g, r ) );
}
}
return HSI_Image;
}
// 将HSI颜色模型的数据转换为RGB颜色模型的图像
IplImage* HSI2RGBImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I)
{
IplImage * RGB_Image = cvCreateImage(cvGetSize(HSI_H), IPL_DEPTH_8U, 3 );
int iB, iG, iR;
for(int i = 0; i < RGB_Image->height; i++)
{
for(int j = 0; j < RGB_Image->width; j++)
{
// 该点的色度H
double dH = cvmGet( HSI_H, i, j );
// 该点的色饱和度S
do