前段時間在一個公司做兼職,做的就是濾鏡的效果,起初我並沒有太怎麼思考,想着很簡單的事情,所以一直拖着沒有完成,結果到了快交任務的時候有點着急了,因爲我調了兩天的效果,發現事情根本不是我想象中的那樣簡單,並且也參考了很多文章,始終沒有找到我的理想的效果方法。最後在公司兩位美工同事的幫助下順利完成了任務,最重要的是我找到了一種非常好的方法!老規矩先上代碼,再講原理,其實原理灰常簡單!
#include <opencv/cv.h>
#include <opencv2/contrib/contrib.hpp>
#include <opencv/highgui.h>
float layerOverlay(float A, float B)//疊加
{
return (A < 128) ? (2 * A * B / 255) : (255 - 2 * (255 - A) * (255 - B) / 255);
}
float layerMultiply(float A,float B)//正片疊底
{
return A*B/255;
}
Mat FanYNew(Mat src,Mat src2)//泛黃
{
int width = src.cols;
int height = src.rows;
int width1 = src2.cols;
int height1 = src2.rows;
std::cout<<width<<std::endl<<width1<<std::endl<<height<<std::endl<<height1<<std::endl;
Mat dst(src.size(),CV_8UC3);
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
dst.ptr<uchar>(i)[3*j] = layerMultiply(src.ptr<uchar>(i)[3*j],src2.ptr<uchar>(i)[3*(j)]);
dst.ptr<uchar>(i)[3*j+1] = layerMultiply(src.ptr<uchar>(i)[3*j+1],src2.ptr<uchar>(i)[3*(j)+1]);
dst.ptr<uchar>(i)[3*j+2] = layerMultiply(src.ptr<uchar>(i)[3*j+2],src2.ptr<uchar>(i)[3*(j)+2]);
}
}
return dst;
}
Mat cold(Mat src,Mat src2)//冷色調
{
int width = src.cols;
int height = src.rows;
int width1 = src2.cols;
int height1 = src2.rows;
std::cout<<width<<std::endl<<width1<<std::endl<<height<<std::endl<<height1<<std::endl;
Mat dst(src.size(),CV_8UC3);
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
dst.ptr<uchar>(i)[3*j] = layerOverlay(src.ptr<uchar>(i)[3*j],src2.ptr<uchar>(i)[3*(j)]);
dst.ptr<uchar>(i)[3*j+1] = layerOverlay(src.ptr<uchar>(i)[3*j+1],src2.ptr<uchar>(i)[3*(j)+1]);
dst.ptr<uchar>(i)[3*j+2] = layerOverlay(src.ptr<uchar>(i)[3*j+2],src2.ptr<uchar>(i)[3*(j)+2]);
}
}
return dst;
}
原圖及效果圖:
冷色調和泛黃的漸變圖:
這就是我所說的好方法中最終要的一環,漸變圖。起初我不知道叫什麼,和我的兩個美工的朋友弄了一天,主要他們有事情忙,總是擠出時間來幫我。
圖像的濾鏡效果,雖然大體上的效果稱呼不多,比如:黑白,懷舊,冷色調,暖色調等等,但是要想調出自己心中的濾鏡效果着實挺費勁的,因此,我採用了仿照Photoshop的方式,將兩張圖片用photoshop的方法,比如正片疊底,或者疊加等等方法,一共大致16種,反正我只寫了16種。所以總結,美工和程序員實在是不可分家呀!有沒有!