用源图像的色调风格来影响目标图片的风格(source为源图像:提取色调风格的图像;dst为目标图像,res为风格化后的图像)
//
// colortransfer.cpp
// ColorTransfer
//
// Created by Rachel on 13-12-2.
// Copyright (c) 2013年 ZJU. All rights reserved.
// Email: zrqjennifer@sina.com
//
//
//
// Input: image src (想用src的颜色分布) , dst(要转换的图像).
// Output: 结果放在res中.
//
//
#include "iostream"
//#include "showhelper.h"
#include "cv.h"
#include "highgui.h"
using namespace std;
//#pragma comment (lib, "cv.lib")
//#pragma comment (lib,"cxcore.lib")
//#pragma comment (lib,"highgui.lib")
IplImage* Transform(IplImage* A,CvScalar avg_src, CvScalar avg_dst,CvScalar std_src, CvScalar std_dst)
{
for(int i=0;i<3;i++)
{
for(int x=0;x<A->height;x++)
{
uchar *ptr=(uchar*)(A->imageData+x*A->widthStep);
for(int y=0;y<A->width;y++)
{
double tmp=ptr[3*y+i];
int t=(int)((tmp-avg_dst.val[i])*(std_src.val[i]/std_dst.val[i])+avg_src.val[i]);
t = t<0?0:t;
t = t>255?255:t;
ptr[3*y+i]=t;
}
}
}
return A;
}
void main()
{
//load
IplImage* source = cvLoadImage("C:\\Documents and Settings\\All Users\\Documents\\My Pictures\\示例图片\\Sunset.jpg",CV_LOAD_IMAGE_COLOR);
IplImage* dst = cvLoadImage("D:\\人脸检测图片\\网络图片\\21.jpg",CV_LOAD_IMAGE_COLOR);
IplImage* dstlab = cvCreateImage(cvGetSize(dst),dst->depth,dst->nChannels);
IplImage* res = cvCreateImage(cvGetSize(dst),dst->depth,dst->nChannels);
dstlab = cvCloneImage(dst);
//calculate average and standard derivation
CvScalar avg_src,avg_dst,std_src, std_dst;
cvAvgSdv(source,&avg_src,&std_src);
cvAvgSdv(dstlab, &avg_dst, &std_dst);
//transform
dstlab = Transform(dstlab,avg_src,avg_dst,std_src, std_dst);
res = cvCloneImage(dstlab);
//cvShowManyImages("Color Transform",3, source, dst, res);
cvNamedWindow("source",CV_WINDOW_AUTOSIZE);
cvShowImage("source",source);
cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
cvShowImage("dst",dst);
cvNamedWindow("res",CV_WINDOW_AUTOSIZE);
cvShowImage("res",res);
cvWaitKey();
cvReleaseImage(&source);
cvReleaseImage(&dst);
cvReleaseImage(&dstlab);
cvReleaseImage(&res);
}