b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

opencv图像处理的几种算法的总结

电脑杂谈  发布时间:2020-06-07 02:17:53  来源:网络整理

图象处理算法_闭图象定理_金字塔算法——曲线曲面几何模型的动态编程处理

图像特征检测

通常,当我们看到要识别的图像时,我们会考虑该图像具有哪些特征,边缘特征,纹理特征等. 这是几种常见的特征检测算法

1个哈里斯拐角检测

在图像上采用W * W“滑动窗口”,不断移动该窗口并检测该窗口中的像素变化E. 像素变化E可以简单地分为以下三种类型: A如果窗口中的图像是平坦的,则E的变化并不大. B如果窗口中的图像是侧面图象处理算法,则沿该侧滑动时E几乎不变,而沿垂直于该侧的方向滑动窗口时E则变化很大. C如果窗口中的图像是一个角,则当窗口向任何方向移动时,E的值都会发生很大变化.

该算法的基本思想是使用固定的窗口在任何方向上在图像上滑动. 比较幻灯片前后的两种情况. 窗口中像素灰度的变化程度. 如果在任何方向都有幻灯片,则灰度变化很大,那么我们可以在此窗口中想到一个角.

闭图象定理_图象处理算法_金字塔算法——曲线曲面几何模型的动态编程处理

[u.v]是窗口偏移,(x,y)是像素坐标位置. 位置和窗户一样多. opencv有自己的API.

void cornerHarris(
	InputArray src,//输入图像,单通道8位或浮点图像
	OutputArray dst,//输出图像类型CV_32FC1,大小同原图像
	int blockSize,//邻域的大小
	int ksize,//Sobel算子的孔径大小
	double k,//Harris参数
	int borderType = BORDER_DEFAULT);//边界模式

2个haar,lbp功能

提取特征时,您可以先使用直方图均衡来改善较低的对比度,因为这两个特征会使用差异.

主要思想是使用haar模板在图像上滑动. 从黑色像素值中减去模板中的白色像素值以获得特征值,该特征值反映了图像的灰度变化. 例如,眼睛的颜色比脸颊的颜色深. 积分图可以快速计算出特征值. 通常与adaboost结合形成级联分类器,步骤如下:

图象处理算法_金字塔算法——曲线曲面几何模型的动态编程处理_闭图象定理

提取特征值-使用adaboost算法更好地选择矩形特征的组合以形成分类器-以决策树的形式存储分类器-以级联方式构造级联分类器

在上述每个步骤中,opencv都有其自己的接口. 还有受过训练的分类器供用户使用.

3种猪的功能

图像的外观和形状可以通过像素的渐变来表示. 主要用于行人检测. 它还有自己的API,通常与SVM分类器结合使用.

图像旋转

闭图象定理_金字塔算法——曲线曲面几何模型的动态编程处理_图象处理算法

有两种情况. 在第一种情况下,图片原本是正方形的(从上方拍摄). 您要更改它. 您可以在任何角度使用透视图. 想法如下

二值化-形态运算(更好的轮廓提取)-查找轮廓-过滤轮廓-查找直线(Hough变换)-查找四条直线的交点(使用y = kx + c)-视角随这四点.

CvMat* cvGetPerspectiveTransform( const CvPoint2D32f*src, const CvPoint2D32f* dst, CvMat*map_matrix );
src 输入图像的四边形顶点坐标。
dst 输出图像的相应的四边形顶点坐标。
map_matrix 指向3×3输出矩阵的指针。
对图像进行透视变换
void cvWarpPerspective( const CvArr* src, CvArr* dst,const CvMat* map_matrix,  int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalar fillval=cvScalarAll(0) );
src 输入图像.
dst 输出图像.
map_matrix 3×3 变换矩阵
flags  插值方法和以下开关选项的组合: CV_WARP_FILL_OUTLIERS- 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
CV_WARP_INVERSE_MAP- 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换
//使用案例
vector<Point2f> src_corners(4);
	src_corners[0] = p1;
	src_corners[1] = p2;
	src_corners[2] = p3;
	src_corners[3] = p4;
	vector<Point2f> dst_corners(4);
	dst_corners[0] = Point(0, 0);
	dst_corners[1] = Point(width, 0);
	dst_corners[2] = Point(0, height);
	dst_corners[3] = Point(width, height);
	// 获取透视变换矩阵
	Mat resultImage;
	Mat warpmatrix = getPerspectiveTransform(src_corners, dst_corners);
	warpPerspective(src, resultImage, warpmatrix, resultImage.size(), INTER_LINEAR);
	namedWindow("Final Result", CV_WINDOW_AUTOSIZE);
	imshow("Final Result", resultImage);

还有一个旋转的图像,您可以使用以下API:

图像的角度src.angle
Mat getRotationMatrix2D(Point2f center, double angle, double scale)
参数详解:
Point2f center:表示旋转的中心点
double angle:表示旋转的角度
double scale:图像缩放因子
将刚刚求得的仿射变换应用到源图像
warpAffine( src, warp_dst, warp_mat, warp_dst.size() );
函数有以下参数:
src: 输入源图像
warp_dst: 输出图像
warp_mat: 仿射变换矩阵
warp_dst.size(): 输出图像的尺寸

图象处理算法_金字塔算法——曲线曲面几何模型的动态编程处理_闭图象定理

图像分割

图像分割是为了区分图像中的不同类型的块,

类似于此效果,可以在分割后剪切肖像. 使用算法聚类算法Kmeans聚类算法. 原理是确定分类数,为每个类初始化一个中心点图象处理算法,并计算数据集. 到中心点的距离,然后为分类的数据集重新计算(取平均值)中心位置. 重新分类后,知道已达到阈值.

将此算法应用于RGB图像需要先将图像数据转换为样本数据,代码如下:

   //图像数据转到样本数据 
   int index = 0;
	for (int row = 0; row < h; row++) {
		for (int col = 0; col < w; col++) {
			index = row*w + col;
			Vec3b bgr = image.at<Vec3b>(row, col);
			points.at<float>(index, 0) = static_cast<int>(bgr[0]);
			points.at<float>(index, 1) = static_cast<int>(bgr[1]);
			points.at<float>(index, 2) = static_cast<int>(bgr[2]);
		}
	}
   // 运行KMeans
	int numCluster = 4;
	Mat labels;
	Mat centers;
	TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1);
	kmeans(points, numCluster, labels, criteria, 3, KMEANS_PP_CENTERS, centers);
   
   //对分类好的数据,就任你处置了,你可以替换背景,把背景变成黑色,图像变成白色
   //
	// 去背景+遮罩生成
	Mat mask=Mat::zeros(src.size(), CV_8UC1);
	int index = src.rows*2 + 2;
	int cindex = labels.at<int>(index, 0);
	int height = src.rows;
	int width = src.cols;
	//Mat dst;
	//src.copyTo(dst);
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			index = row*width + col;
			int label = labels.at<int>(index, 0);
			if (label == cindex) { // 背景
				//dst.at<Vec3b>(row, col)[0] = 0;
				//dst.at<Vec3b>(row, col)[1] = 0;
				//dst.at<Vec3b>(row, col)[2] = 0;
				mask.at<uchar>(row, col) = 0; 
			} else {
				mask.at<uchar>(row, col) = 255;
			}
		}
	}
	//imshow("mask", mask);

关键是要记住图像的像素操作.

图像中粘性物体的分离

图像中直线检测的原理

图像阈值运算的分割方法


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-236658-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...