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

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

连环画效果图:


熔铸画效果:


冰冻画效果




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

血_影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值