图片风格化

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

原文链接

Matlab中可以使用卷积神经网络(CNN)对图片进行风格化处理,常见的方法有VGG网络和ResNet网络。这里以VGG网络为例进行说明。 使用Matlab中的VGG网络进行图片风格化处理的步骤如下: 1. 读入需要进行风格化处理的原始图片和目标风格图片,并将它们转换为网络输入所需的格式。 2. 使用Matlab中的VGG网络加载预训练权重,并将原始图片和目标风格图片输入网络中。 3. 使用Gram矩阵计算原始图片和目标风格图片在网络中的特征表示,并计算它们之间的风格损失。 4. 使用Matlab中的反向传播算法对网络进行训练,使得原始图片在风格损失的约束下逐渐趋向于目标风格图片。 5. 输出训练得到的风格化图片。 下面是一个简单的Matlab代码示例: ```matlab % 读入原始图片和目标风格图片并转换为网络输入格式 orig_img = imread('original.jpg'); orig_img = imresize(orig_img, [224, 224]); orig_img = single(orig_img); orig_img = bsxfun(@minus, orig_img, net.meta.normalization.averageImage); style_img = imread('style.jpg'); style_img = imresize(style_img, [224, 224]); style_img = single(style_img); style_img = bsxfun(@minus, style_img, net.meta.normalization.averageImage); % 使用VGG网络计算原始图片和目标风格图片的风格特征表示和风格损失 orig_features = vl_simplenn(net, orig_img); style_features = vl_simplenn(net, style_img); orig_gram = compute_gram(orig_features); style_gram = compute_gram(style_features); style_loss = compute_style_loss(orig_gram, style_gram); % 反向传播算法进行网络训练 lr = 2; num_iters = 1000; for i = 1:num_iters % 计算训练图片的特征表示和风格损失 train_features = vl_simplenn(net, train_img); train_gram = compute_gram(train_features); train_loss = compute_style_loss(train_gram, style_gram); % 计算总损失并更新网络 total_loss = train_loss + lambda * content_loss; gradients = vl_simplenn(net, train_img, 1, total_loss, 'conserveMemory', true); train_img = train_img - lr * gradients; end % 输出训练得到的风格化图片 imshow(train_img); ``` 需要注意的是,风格化处理的效果与网络的架构、参数设置、损失函数等相关,具体的调整需要根据实际情况进行。同时,风格化处理的计算量较大,需要在计算资源允许的情况下进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值