1. 程式人生 > >openCV學習記錄:濾鏡:交叉沖印

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

參考文章:
參考文章