图层混合
// mix.cpp : 图像mix
//
#include "stdafx.h"
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
// Multiply 正片叠底
void Multiply(Mat& src1, Mat& src2, Mat& dst)
{
for(int index_row=0; index_row<src1.rows; index_row++)
{
for(int index_col=0; index_col<src1.cols; index_col++)
{
for(int index_c=0; index_c<3; index_c++)
dst.at<Vec3f>(index_row, index_col)[index_c]=
src1.at<Vec3f>(index_row, index_col)[index_c]*
src2.at<Vec3f>(index_row, index_col)[index_c];
}
}
}
// Color_Burn 颜色加深
void Color_Burn(Mat& src1, Mat& src2, Mat& dst)
{
for(int index_row=0; index_row<src1.rows; index_row++)
{
for(int index_col=0; index_col<src1.cols; index_col++)
{
for(int index_c=0; index_c<3; index_c++)
dst.at<Vec3f>(index_row, index_col)[index_c]=1-
(1-src1.at<Vec3f>(index_row, index_col)[index_c])/
src2.at<Vec3f>(index_row, index_col)[index_c];
}
}
}
// 线性增强
void Linear_Burn(Mat& src1, Mat& src2, Mat& dst)
{
for(int index_row=0; index_row<src1.rows; index_row++)
{
for(int index_col=0; index_col<src1.cols; index_col++)
{
for(int index_c=0; index_c<3; index_c++)
dst.at<Vec3f>(index_row, index_col)[index_c]=max(
src1.at<Vec3f>(index_row, index_col)[index_c]+
src2.at<Vec3f>(index_row, index_col)[index_c]-1, (float)0.0);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//首先做灰度的mix
Mat src = imread("1.jpg");
Mat mask = imread("mask2.jpg");
Mat maskF(src.size(),CV_32FC3);
Mat srcF(src.size(),CV_32FC3);
Mat dstF(src.size(),CV_32FC3);
src.convertTo(srcF,CV_32FC3);
mask.convertTo(maskF,CV_32FC3);
srcF = srcF /255;
maskF = maskF/255;
Mat dst(srcF);
//正片叠底
Multiply(srcF,maskF,dstF);
dstF = dstF *255;
dstF.convertTo(dst,CV_8UC3);
imwrite("正片叠底.jpg",dst);
// Color_Burn 颜色加深
Color_Burn(srcF,maskF,dstF);
dstF = dstF *255;
dstF.convertTo(dst,CV_8UC3);
imwrite("颜色加深.jpg",dst);
// 线性增强
Linear_Burn(srcF,maskF,dstF);
dstF = dstF *255;
dstF.convertTo(dst,CV_8UC3);
imwrite("线性增强.jpg",dst);
waitKey();
return 0;
}