OpenCV——PS 图层混合算法 (二)「建议收藏」

OpenCV——PS 图层混合算法 (二)

大家好,又见面了,我是全栈君。

详细的算法原理能够參考

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 Linear_Burn(Mat& src1, Mat& src2, Mat& dst);
void Linear_Dodge(Mat& src1, Mat& src2, Mat& dst);
void Lighten(Mat& src1, Mat& src2, Mat& dst);
void Darken(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);

    //Linear_Burn(Image_up, Image_down, Image_mix);
    //Linear_Dodge(Image_up, Image_down, Image_mix);
    //Lighten(Image_up, Image_down, Image_mix);
    //Darken(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;
}

// linear Burn

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);
        }
    }
}

// linear dodge
void Linear_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]=min(
                         src1.at<Vec3f>(index_row, index_col)[index_c]+
                         src2.at<Vec3f>(index_row, index_col)[index_c], (float)1.0);
        }
    }
}

// Lighten
void Lighten(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]);
        }
    }
}


// Darken
void Darken(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]=min(
                         src1.at<Vec3f>(index_row, index_col)[index_c],
                         src2.at<Vec3f>(index_row, index_col)[index_c]);
        }
    }



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115338.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月5日 下午9:00
下一篇 2022年2月5日 下午10:00


相关推荐

  • HTTP与HTTPS的区别,详细介绍[通俗易懂]

    HTTP与HTTPS的区别,详细介绍[通俗易懂]目录HTTP与HTTPS介绍HTTPS和HTTP的主要区别客户端在使用HTTPS方式与Web服务器通信时的步骤CA证书的申请及其使用过程HTTPS的缺点SSL与TLS的区别?SSL/TLS历史SSL/TLS协议的基本过程HTTPS涉及的计算环节如何优化HTTPS的速度HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在We…

    2022年6月14日
    43
  • 解决oracle创建用户不能登录

    解决oracle创建用户不能登录//用system身份登录SQL&gt;createuserusernameidentifiedbyuserpwd;用户已创建SQL&gt;grantconnecttousername;授权成功。SQL&gt;connusername/userpwd;已连接。//此时新创建的用不能创建表的….若要创建的用户能够…

    2022年5月18日
    41
  • 打工人福音!“超级智能体Skywork Super Agents“来了,PPT、文档、EXCEL一键生成,效率翻倍!

    打工人福音!“超级智能体Skywork Super Agents“来了,PPT、文档、EXCEL一键生成,效率翻倍!

    2026年3月15日
    2
  • 权限控制(delphi actionlist)

    权限控制(delphi actionlist)权限控制 delphiTActio 方案 在软件开发中 为软件加入权限控制功能 使不同的用户有不同的使用权限 是非常重要的一项功能 由其在开发数据库方面的应用 这项功能更为重要 但是 要为一个应用加入全面的权限控制功能 又怎样实现呢 大家知道 现在的应用 一般均以菜单访问功能的形式出现 按照常规的做法 只要让注册进入应用的不同用户 可以访问不同的功能菜单 从而实现功能权限的控制 但是 有

    2026年3月26日
    2
  • PMP项目管理五大过程组

    PMP项目管理五大过程组01 启动过程组定义并批准项目或阶段 授权开始该项目或阶段的一组过程 启动过程一般要求启动会或者开工会议 授权 定义个项目或者项目的新阶段 正式开始改项目或者阶段 定义初步范围 落实财务资源 识别内外干系人 选定项目经理 多阶段启动 确保最初决策的合理性 保证符合预定的业务需要 审查干系人影响 决定项目是否继续 干系人参与 提高其主人翁意识 使其更容易接受成果和对项

    2026年3月17日
    2
  • VUE中$refs的基本用法

    VUE中$refs的基本用法ref 有三种用法 1 ref 加在普通的元素上 用 this refs ref 值 获取到的是 dom 元素 2 ref 加在子组件上 用 this refs ref 值 获取到的是组件实例 可以使用组件的所有方法 在使用方法的时候直接 this refs ref 值 方法 就可以使用了 3 如何利用 v for 和 ref 获取一组数组或者 dom 节点应注意的坑

    2026年3月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号