熔铸滤镜
熔铸滤镜模仿工业上的钢铁熔铸,相当于把照片在火上烤的通红。算法如下:
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);
}
效果图如下: