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

交叉冲印滤镜

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

来一张Lena女神的效果图:

这里写图片描述


再来一张风景效果图:

这里写图片描述

完整版代码如下:

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

参考文章:
参考文章

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值