• 图层混合


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





  • 相关阅读:
    无缝轮播图
    瀑布流之ajax
    进阶版轮播图
    桌面特效
    3D模型文字动画
    Razor 常用方法
    easyui常用
    C#
    Redis设置记录
    日志三剑客ELK
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/4695618.html
Copyright © 2020-2023  润新知