openCV學習記錄:濾鏡:交叉沖印
阿新 • • 發佈:2019-01-01
交叉沖印濾鏡
交叉沖印還有一個名字叫正片負衝,經過該濾鏡修飾的照片亮部變黃,暗部變藍,色彩更加豔麗。
來一張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);
}
參考文章:
參考文章