opencv实现之怀旧色 、 连环画 、熔铸 、冰冻

要用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 
#include 
using namespace cv;

int main()
{
    Mat src = imread("/home/xinyi61/qtProject/qtTest/people.jpg",1);
    if(!src.data)
    {
         cout<<"imread img error"<(i);
        uchar *ptr_dst = dst.ptr(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);
}
实验效果图如下所示:

opencv实现之怀旧色 、 连环画 、熔铸 、冰冻_第1张图片


实现连环画 、熔铸 、冰冻效果的代码和实现怀旧差不了多少,只需满足相应的表达式即可。

连环画效果实现表达式:

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;

这里我就不一一将代码附上了,感兴趣的可以去实现下。其效果效果图片如下

连环画效果图:

opencv实现之怀旧色 、 连环画 、熔铸 、冰冻_第2张图片

熔铸画效果:

opencv实现之怀旧色 、 连环画 、熔铸 、冰冻_第3张图片

冰冻画效果

opencv实现之怀旧色 、 连环画 、熔铸 、冰冻_第4张图片



你可能感兴趣的:(opencv实现之怀旧色 、 连环画 、熔铸 、冰冻)