openCV学习记录:滤镜:熔铸&冰冻

熔铸滤镜

熔铸滤镜模仿工业上的钢铁熔铸,相当于把照片在火上烤的通红。算法如下:

r = r*128/(g+b +1);
g = g*128/(r+b +1);
b = b*128/(g+r +1);

RGB分量的值要控制在0~255之间。

完整代码如下:

#include<opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void rongZhuFilter(Mat &srcImage);

int main(){
    Mat srcImage = imread("lena.jpg");//图片在工程目录下,否则写绝对路径

    if(!srcImage.data || srcImage.empty()){
        cout<<"读入图片错误!"<<endl;
        return -1;
    }

    imshow("原图",srcImage);

    rongZhuFilter(srcImage);

    waitKey(0);
    return 0;
}

void rongZhuFilter(Mat &srcImage){
    int rowNum = srcImage.rows;
    int colNum = srcImage.cols;

    for(int j = 0;j<rowNum;j++){
        uchar* data = srcImage.ptr<uchar>(j);
        for(int i = 0;i<colNum;i++){
            int b = data[i*3];
            int g = data[i*3+1];
            int r = data[i*3+2];

            int R = static_cast<int>(r*128/(g+b + 1));
            int G = static_cast<int>(g*128/(r+b + 1));
            int B = static_cast<int>(b*128/(g+r + 1));

            //RGB分量的值控制在0~255之间
            data[i*3+2] = max(0,min(R,255));
            data[i*3+1] = max(0,min(G,255));
            data[i*3] = max(0,min(B,255));
        }
    }

    imshow("熔铸滤镜",srcImage);
}

来张效果图:

这里写图片描述



冰冻滤镜


冰冻滤镜的算法如下:
r = |r-g-b|*3/2;
g = |g-r-b|*3/2;
b = |b-g-r|*3/2;

RGB分量的值也要控制在0~255之间。

完整代码如下:

#include<opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void bingDongFilter(Mat &srcImage);

int main(){
    Mat srcImage = imread("lena.jpg");//图片在工程目录下,否则写绝对路径

    if(!srcImage.data || srcImage.empty()){
        cout<<"读入图片错误!"<<endl;
        return -1;
    }

    imshow("原图",srcImage);

    bingDongFilter(srcImage);

    waitKey(0);
    return 0;
}

void bingDongFilter(Mat &srcImage){
    int rowNum = srcImage.rows;
    int colNum = srcImage.cols;

    for(int j = 0;j<rowNum;j++){
        uchar* data = srcImage.ptr<uchar>(j);
        for(int i = 0;i<colNum;i++){
            int b = data[i*3];
            int g = data[i*3+1];
            int r = data[i*3+2];

            int R = static_cast<int>(abs(r-g-b)*3>>1);
            int G = static_cast<int>(abs(g-r-b)*3>>1);
            int B = static_cast<int>(abs(b-g-r)*3>>1);

            data[i*3+2] = max(0,min(R,255));
            data[i*3+1] = max(0,min(G,255));
            data[i*3] = max(0,min(B,255));
        }
    }

    imshow("冰冻滤镜",srcImage);
}

效果图如下:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值