详细的算法原理能够參考

PS图层混合算法之中的一个(不透明度,正片叠底,颜色加深,颜色减淡)

// PS_Algorithm.h

#ifndef PS_ALGORITHM_H_INCLUDED

#define PS_ALGORITHM_H_INCLUDED

#include <iostream>

#include <string>

#include "cv.h"

#include "highgui.h"

#include "cxmat.hpp"

#include "cxcore.hpp"

using namespace std;

using namespace cv;

#endif // PS_ALGORITHM_H_INCLUDED

// main function

#include "PS_Algorithm.h"

void Transparent(Mat& src1, Mat& src2, Mat& dst, double alpha);

void Multiply(Mat& src1, Mat& src2, Mat& dst);

void Color_Burn(Mat& src1, Mat& src2, Mat& dst);

void Color_Dodge(Mat& src1, Mat& src2, Mat& dst);

int main(void)

{

    Mat Origin_Image1;

    Mat Origin_Image2;

    Origin_Image1=imread("2.jpg");

    Origin_Image2=imread("3.jpg");

    Mat Image_up(Origin_Image1.size(),CV_32FC3);

    Mat Image_down(Origin_Image2.size(), CV_32FC3);

    Origin_Image1.convertTo(Image_up,CV_32FC3);

    Origin_Image2.convertTo(Image_down,CV_32FC3);

    Image_up=Image_up/255;

    Image_down=Image_down/255;

    Mat Image_mix(Image_up);



    //double alpha=0.25;

    //Transparent(Image_up, Image_down, Image_mix, alpha);

    //Multiply(Image_up, Image_down, Image_mix);

    //Color_Burn(Image_up, Image_down, Image_mix);

    //Color_Dodge(Image_up, Image_down, Image_mix);

   

    namedWindow("Img", CV_WINDOW_AUTOSIZE);

    imshow("Img",Image_mix);

    waitKey();

    cvDestroyWindow("Img");

    cout<<"All is well."<<endl;

    return 0;

}

// Transparent 不透明度

void Transparent(Mat& src1, Mat& src2, Mat& dst, double alpha)

{

    dst=alpha*src1+(1-alpha)*src2;

}





// 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];

        }

    }

}



// Color_Dodge 颜色减淡

void Color_Dodge(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]=

                          src2.at<Vec3f>(index_row, index_col)[index_c]/

                         (1-src1.at<Vec3f>(index_row, index_col)[index_c]);

        }

    }

}

最新文章

  1. 数据结构作业——buzhidao(队列)
  2. java类读取properties文件
  3. Windows下安装openssl
  4. Facade设计模式
  5. codeforces 515A.Drazil and Date 解题报告
  6. 线程中无法实例化spring注入的服务的解决办法
  7. java 读取文件中文乱码问题
  8. pptv web前端面试题答案
  9. Keil C51中函数指针的使用
  10. 27_Blog Reader
  11. Codeforces Round #331 (Div. 2) _A. Wilbur and Swimming Pool
  12. flutter Provide 状态管理篇
  13. vue组件详解——使用slot分发内容
  14. C#高阶与初心:(一)List.Add添加的到底是什么?
  15. Windows 登录用户的类型
  16. Python关于self用法重点分析
  17. android 开发 修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)
  18. Easyui combobox onChange事件
  19. PHP学习日记 Windows配置PHP+Nginx+自动化脚本
  20. C++11奇怪的语法

热门文章

  1. Merge Two Sorted Lists 解答
  2. java实现写大量数据到文件中
  3. Android窗口管理服务WindowManagerService的简要介绍和学习计划
  4. C# 移动端与PC端的数据交互
  5. 使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)
  6. iOS 使用NJKWebViewProgress做webview进度条
  7. C# Cache何时使用及使用方法
  8. ffmpeg推rtmp流到crtmpserver直播
  9. 写一个Windows上的守护进程(1)开篇
  10. 类型 - PHP手册笔记