线条滤镜
线条滤镜主要是勾勒出图片的主要轮廓线,处理过程是:
- 图像灰度化
- 滤波
- 边缘检测
二值化
完整代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void xianTiaoFilter(Mat &srcImage);
int main(){
Mat srcImage = imread("lena.jpg");
if(!srcImage.data || srcImage.empty()){
cout<<"读入图片错误!"<<endl;
return -1;
}
imshow("原图",srcImage);
xianTiaoFilter(srcImage);
waitKey(0);
return 0;
}
void xianTiaoFilter(Mat &srcImage){
Mat grayImage;
//灰度化
cvtColor(srcImage, grayImage, CV_BGR2GRAY);
// 设置中值滤波器参数
medianBlur(grayImage, grayImage, 7);
// Laplacian边缘检测
Mat edge;
Laplacian(grayImage, edge, CV_8U, 5);
imshow("La",edge);
// 对边缘检测结果进行二值化
Mat dstImage;
threshold(edge, dstImage, 127, 255, THRESH_BINARY_INV);// >127 ? 0:255,用黑色描绘轮廓
imshow("线条滤镜",dstImage);
}
效果如下:
素描滤镜
参考文章:小熊不去实验室
完整代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void suMiaoFilter(Mat &srcImage);
int main(){
Mat srcImage = imread("lena.jpg");
if(!srcImage.data || srcImage.empty()){
cout<<"读入图片错误!"<<endl;
return -1;
}
imshow("原图",srcImage);
suMiaoFilter(srcImage);
waitKey(0);
return 0;
}
void suMiaoFilter(Mat &srcImage){
Mat gray0,gray1;
//去色,灰度化
cvtColor(srcImage,gray0,CV_BGR2GRAY);
//反色
addWeighted(gray0,-1,NULL,0,255,gray1);
//高斯模糊,高斯核的Size与最后的效果有关
GaussianBlur(gray1,gray1,Size(11,11),0);
//融合:颜色减淡
Mat dstImage(gray1.size(),CV_8UC1);
for (int y=0; y<srcImage.rows; y++)
{
uchar* P0 = gray0.ptr<uchar>(y);
uchar* P1 = gray1.ptr<uchar>(y);
uchar* P = dstImage.ptr<uchar>(y);
for (int x=0; x<srcImage.cols; x++)
{
int tmp0=P0[x];
int tmp1=P1[x];
P[x] =(uchar) min((tmp0+(tmp0*tmp1)/(256-tmp1)),255);
}
}
imshow("素描滤镜",dstImage);
}
效果如下: