您的位置:首页 > 运维架构

openCV学习记录:滤镜:交叉冲印

2016-02-03 05:09 274 查看
交叉冲印滤镜

交叉冲印还有一个名字叫正片负冲,经过该滤镜修饰的照片亮部变黄,暗部变蓝,色彩更加艳丽。

来一张Lena女神的效果图:






再来一张风景效果图:



完整版代码如下:

[code]#include<opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void punchFilter(Mat &srcImage);

int main(){
    Mat srcImage = imread("lena.jpg");//图片在工程目录下,否则写绝对路径

    if(!srcImage.data || srcImage.empty()){
        cout<<"读入图片错误!"<<endl;
        return -1;
    }

    imshow("原图",srcImage);

    punchFilter(srcImage);

    waitKey(0);
    return 0;
}

void punchFilter(Mat &srcImage){
    int rowNum = srcImage.rows;
    int colNum = srcImage.cols;
    int gray, value;
    int rMap[256], gMap[256], bMap[256];
    for(int i = 0;i<256;i++)
    {
        value = i < 128 ? i : 256 - i;
        gray = (int)pow(value,3) >> 14; // value的3次方再除以16384
        rMap[i] = i < 128 ? gray : 256 - gray;
        gray = (int)pow(value,2) >>7; // value的2次方再除以128
        gMap[i] = i < 128 ? gray : 256 - gray;
        bMap[i] = i / 2 + 0x25;//0x25 = 37
    }

    for(int j = 0;j<rowNum-1;j++){
        uchar* data = srcImage.ptr<uchar>(j);
        for(int i = 0;i<colNum-1;i++){
            int b = bMap[data[i*3]];
            int g = gMap[data[i*3+1]];
            int r = rMap[data[i*3+2]];
            data[i*3] = min(255, max(0, b));
            data[i*3+1] = min(255, max(0, g));
            data[i*3+2] = min(255, max(0, r));
        }
    }

    imshow("交叉冲印滤镜",srcImage);
}


参考文章:

参考文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: