交叉冲印滤镜
交叉冲印还有一个名字叫正片负冲,经过该滤镜修饰的照片亮部变黄,暗部变蓝,色彩更加艳丽。
来一张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);
}
参考文章:
参考文章