天天看點

圖層混合

// 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)

                dst.at<Vec3f>(index_row, index_col)[index_c]=1-

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

// 線性增強

void Linear_Burn(Mat& src1, Mat& src2, Mat& dst)

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

    imwrite("顔色加深.jpg",dst);

    // 線性增強

    Linear_Burn(srcF,maskF,dstF);

    imwrite("線性增強.jpg",dst);

    waitKey();

    return 0;

來自為知筆記(Wiz)

目前方向:圖像拼接融合、圖像識别

聯系方式:[email protected]

繼續閱讀