zoukankan      html  css  js  c++  java
  • 图层混合

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





  • 相关阅读:
    java中如何使正在运行中的线程退出
    Java如何等待子线程执行结束
    java解析xml几种方式
    【Flask】配置参数
    【Flask】Session
    【Flask】jinja2
    【Flask】Request
    【Flask】Respones
    【Flask】路由系统
    【Flask】认识Flask
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/4695618.html
Copyright © 2011-2022 走看看