图片风格化

用源图像的色调风格来影响目标图片的风格(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);
  }

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值