要用opencv实现怀旧效果则必须满足一下表达式:
R = 0.393*r + 0.769 * g + 0.189 * b;
G = 0.349*r + 0.686 * g + 0.168 * b;
B = 0.272*r + 0.534 * g + 0.131 * b;
则其代码实现过程如下:
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
int main()
{
Mat src = imread("/home/xinyi61/qtProject/qtTest/people.jpg",1);
if(!src.data)
{
cout<<"imread img error"<<endl;
return -1;
}
Mat dst(src.size(),CV_8UC3);
namedWindow("origin image");
namedWindow("dst image");
imshow("origin image",src);
int width = src.cols;
int height = src.rows;
for(int i =0; i < height; ++i)
{
uchar *ptr_src = src.ptr<uchar>(i);
uchar *ptr_dst = dst.ptr<uchar>(i);
for(int j = 0; j < width; ++j)
{
float R = ptr_src[3*j+0];//pointer to R
float G = ptr_src[3*j+1];
float B = ptr_src[3*j+2];
float newB=0.272*R+0.534*G+0.131*B;
float newG=0.349*R+0.686*G+0.168*B;
float newR=0.393*R+0.769*G+0.189*B;
if(newB < 0)
{
newB = 0;
}
else if(newB >255)
{
newB =255;
}
if(newG < 0)
{
newG = 0;
}
else if(newG >255)
{
newG =255;
}
if(newR < 0)
{
newR = 0;
}
else if(newR >255)
{
newR =255;
}
ptr_dst[3*j+0] = (uchar) newB;
ptr_dst[3*j+1] = (uchar) newG;
ptr_dst[3*j+2] = (uchar) newR;
}
}
imshow("dst image",dst);
waitKey(0);
}
实验效果图如下所示:
实现连环画 、熔铸 、冰冻效果的代码和实现怀旧差不了多少,只需满足相应的表达式即可。
连环画效果实现表达式:
R = |g -b + g + r| *r /256;
G = |b -g + b + r| *r /256;
B = |b -g + b + r| *g /256;
熔铸画效果实现表达式:
R = r * 128/(g+b +1);
G = g * 128/(r+b +1);
B = b * 128/(g+r +1);
冰冻画效果实现表达式:
R = (r - g - b) * 3 /2;
G = (g - r - b) * 3 /2;
B = (b - g - r) * 3 /2;
这里我就不一一将代码附上了,感兴趣的可以去实现下。其效果效果图片如下
连环画效果图:
熔铸画效果:
冰冻画效果