OpenCV之计算机视觉任务完成(十二)

1,内置数据结构和输入/输出,提供内置基元来处理与图像处理和计算机视觉相关的操作。OpenCV自带Image、Point、Rectangle等基本结构,且针对速度和内存进行了优化。
2,图像处理操作,执行如图像过滤、形态学操作、几何变换、颜色转换、图像绘制、直方图、形状分析、运动分析、特征检测等操作,大多包含在imgproc模块中。
3,GUI,提供highgui模块用于处理所有高级用户界面操作。
4,视频分析,分析视频中连续帧之间的运动、跟踪视频中的不同目标、创建视频监控模型等,另外videostab模块处理视频稳定的问题,手持摄像机拍摄视频时,通常有很多抖动需要纠正。
5,3D重建,给定一组2D图像,可以使用相关算法重建3D场景,calib3d模块中提供算法找到2D图像中各种对象之间的关系计算其3D位置,同时可处理摄像机校准。
6,特征提取,流行的算法包括尺度不变特征变换(Scale Invariant Feature Transform,简称SIFT)、加速鲁棒特征(Speeded Up Robust Features,简称SURF)和加速分段测试特征(Features From Accelerated Segment Test,简称FAST)。features2d提供检测和提取所有特征功能,xfeatures2d提供更多特征提取器,其中一部分仍处于实验阶段,bioinspired为受到生物学启发的计算机视觉模型提供算法。
7,对象检测,检测给定图像中对象的位置,自带objdetect和xobjdetect模块提供设计对象检测器的框架,可用来开发任何对象探测器。
8,机器学习,广泛用于构建实现目标识别、图像分类、面部检测、视觉搜索等计算机视觉系统。名为ml的模块,捆绑多种机器学习算法,贝叶斯分类器(Bayes classifier)、k近邻(k-nearest neighbor, 简称KNN)、支持向量机(support vector machine, 简称SVM)、决策树(decision tree)、神经网络(neural network)等。还有一个名为快速近似最近邻搜索库(Fast Approximate Nearest Neighbor Search Library, 简称FLANN)模块,其中包含大型数据集中进行快速最近邻搜索算法。
9,计算摄影,使用先进的图像处理技术改善相机捕获的图像,不关注光学过程和图像捕捉方法,使用软件操纵视觉数据。应用领域包括高动态范围成像,全景图像、图像补光和光场相机等。photo、xphoto、stitching模块。
10,形状分析,识别图像中不同形状来分析视觉数据,shape模块。
11,光流算法,用于跟踪视频中连续帧的特征,optflow、tracking模块。
12,人脸和对象识别,识别给定图像中的人物,人脸检测图像中人脸的位置然后识别该人物是谁。face模块。saliency模块目标识别、目标检测和跟踪。
13,表面识别,surface_matching模块包含3D对象识别,以及使用3D特征的姿势估计算法。
14,文本检测和识别,识别给定场景中的文本,包括车牌识别、识别用于自动驾驶汽车的道路标志、将内容数字化的书籍扫描等。text模块。
15,深度学习,应用于图像识别、目标检测、语音识别和自然语言处理,TensorFlow和Caffe重要框架导入器。

直方图

CV_EXPORTS void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          OutputArray hist, int dims, const int* histSize,
                          const float** ranges, bool uniform = true, bool accumulate = false );

/** @overload

this variant uses %SparseMat for output
*/
CV_EXPORTS void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          SparseMat& hist, int dims,
                          const int* histSize, const float** ranges,
                          bool uniform = true, bool accumulate = false );

/** @overload */
CV_EXPORTS_W void calcHist( InputArrayOfArrays images,
                            const std::vector<int>& channels,
                            InputArray mask, OutputArray hist,
                            const std::vector<int>& histSize,
                            const std::vector<float>& ranges,
                            bool accumulate = false );

输入图像
用于计算直方图的输入图像数
用于计算直方图的数字通道尺寸,可使用0
可选的掩码矩阵
用于存储计算得到的直方图的变量
直方图的维度:图像取值的空间维度,灰度平面取值1
要计算的区间数
输入变量的范围:可能的像素值0~255

CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
                             int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());

将直方图绘制到图像中之前,在最小值0和最大值之间标准化直方图矩阵,最大值与输出直方图图像的高度相同。

图像颜色均衡
为了均衡彩色图像,只需均衡亮度通道。可以用任何其他彩色图像格式(HSV/YCrCb)来分离单个通道中的亮度分量。可以选择YCrCb用Y通道(亮度)进行均衡。cvtColor(), COLOR_BGR2YCrCb转换,split分离不同通道,equalizeHist均衡通道0,merge合并。

	Mat result;
	Mat ycrcb;
	cvtColor(img, ycrcb, COLOR_BGR2YCrCb);
	vector<Mat> channels;
	split(ycrcb, channels);
	equalizeHist(channels[0], channels[0]);
	merge(channels, ycrcb);
	cvtColor(ycrcb, result, COLOR_YCrCb2BGR);

Lomography效果
查找表(LUT),添加一个过度图像
1,通过使用查找表将一个曲线应用于红色通道来实现颜色操作效果(bgr)
2,通过对图像应用暗晕来实现复古效果
第一步是通过使用公式1/(1+e(-(x-0.5)/s)),利用曲线变换来操作红色,生成一条让暗值更暗、亮值更亮的曲线,其中x是可能的像素值(0~255),s是常量,较低的常量值会生成低于128的像素值,从而产生非常暗的效果,超过128则非常明亮。

CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst);

在图像中,仅有256个可能的值作为像素值,如果想通过调用函数来改变颜色,预先计算256个值保存在LUT向量中。

	Mat result;
	Mat lut(1, 256, CV_8UC1);
	for (int i = 0; i < 256; i++) {
		float x = (float)i / 256.0;
		lut.at<uchar>(i) = cvRound(256.0 * (1 / (1.0 + pow(exponential_e, -((x - 0.5) / 0.1)))));
	}
	vector<Mat> bgr;
	split(img, bgr);
	LUT(bgr[2], lut, bgr[2]);
	merge(bgr, result);

第二步创建一个内部带有白色圆圈的灰色图像,blur滤镜对圆光晕应用模糊获得平滑效果,将此图像应用于输入图像

	Mat halo(img.rows, img.cols, CV_32FC3, Scalar(0.3, 0.3, 0.3));
	circle(halo, Point(img.rows / 2, img.cols / 2), img.cols / 3, Scalar(1, 1, 1), -1);
	blur(halo, halo, Size(img.rows / 3, img.cols / 3));
	Mat resultf;
	result.convertTo(resultf, CV_32FC3);
	multiply(resultf, halo, resultf);
	resultf.convertTo(result, CV_8UC3);

把输入图像从8位图像转换为32位浮点数,再将每个元素的矩阵相乘,最后将浮点图像矩阵转换为8位图像矩阵。

卡通效果
第一步是检测图像最重要的边缘

	Mat imgMedian;
	medianBlur(img, imgMedian, 7);
	Mat imgCanny;
	Canny(imgMedian, imgCanny, 50, 150);

去除噪声,Canny过滤器检测强边缘

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

输入图像
输出图像
第一阀值
第二阀值
Sobel尺寸光圈
布尔值,是否需要使用更准确的图像梯度幅度
第一阀值和第二阀值之间的最小值用于边缘链接,最大值用于查找强边缘的初始段,Sobel尺寸光圈是将在算法中使用的Sobel滤波器的内核大小
检测到边缘后,用一个小的扩张来连接断开的边缘

	Mat kernel = getStructuringElement(MORPH_RECT, Size(2, 2));
	dilate(imgCanny, imgCanny, kernel);

与Lomography效果类似,需要将边缘的结果图像与彩色图像相乘则需要像素值在0~1范围内,所以将canny边缘检测结果除以256并将边缘反转为黑色

	imgCanny = imgCanny / 255;
	imgCanny = 1 - imgCanny;
	Mat imgCannyf;
	imgCanny.convertTo(imgCannyf, CV_32FC3);
	blur(imgCannyf, imgCannyf, Size(5, 5));

第二步处理颜色

	Mat imgBF;
	bilateralFilter(img, imgBF, 9, 150.0, 150.0);

使用bilateralFilter滤镜,保持边缘的同时降低图像的噪声

CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

输入图像
输出图像
像素邻域直径,如果设置为负,则从Sigma空间值计算
Sigma色值
Sigma坐标空间
直径大于5时,bilateral滤镜开始变慢,Sigma值大于150时,出现卡通效果

为了创建更强大的卡通效果,通过乘以和除以像素值将可能的颜色值截断为10

	Mat result = imgBF / 25;
	result = result * 25;

最后,合并颜色和边缘结果,将两个图像的元素相乘

	Mat imgCanny3c;
	Mat cannyChannels[] = { imgCannyf, imgCannyf, imgCannyf };
	merge(cannyChannels, 3, imgCanny3c);
	Mat resultf;
	result.convertTo(resultf, CV_32FC3);
	multiply(resultf, imgCanny3c, resultf);
	resultf.convertTo(result, CV_8UC3);

即得到卡通效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值