Convex_Hull
- 格式:ppt
- 大小:79.00 KB
- 文档页数:12
Matlab中图像函数大全2matlab 2009-10-26 21:08:13 阅读900 评论0 字号:大中小订阅边学边和大家交流,我将我在学习中搜集到的资料和大家分享!图像处理函数详解——strel功能:用于膨胀腐蚀及开闭运算等操作的结构元素对象(本论坛随即对膨胀腐蚀等操作进行讲解)。
用法:SE = strel(shape,parameters)创建由指定形状shape对应的结构元素。
其中shape的种类有arbitrary''pair''diamond''periodicline''disk''rectangle''line''square''octagon参数parameters一般控制SE的大小。
例子:se1 = strel('square',6)% 创建6*6的正方形se2 = strel('line',10,45)% 创建直线长度10,角度45se3 = strel('disk',15)% 创建圆盘半径15se4 = strel('ball',15,5)% 创建椭圆体,半径15,高度5图像处理函数详解——roipoly功能:用于选择图像中的多边形区域。
用法:BW = roipoly(I,c,r)BW = roipoly(I)BW = roipoly(x,y,I,xi,yi)[BW,xi,yi] = roipoly(...)[x,y,BW,xi,yi] = roipoly(...)BW = roipoly(I,c,r)表示用向量c、r指定多边形各点的X、Y坐标。
BW选中的区域为1,其他部分的值为0.BW = roipoly(I)表示建立交互式的处理界面。
BW = roipoly(x,y,I,xi,yi)表示向量x和y建立非默认的坐标系,然后在指定的坐标系下选择由向量xi,yi指定的多边形区域。
Matlab图像处理函数:regionprops这⾥给出在Matlab图像处理⼯具箱中⾮常重要的⼀个图像分析函数:regionprops。
顾名思义:它的⽤途是get the properties of region,即⽤来度量图像区域属性的函数。
语法STATS = regionprops(L,properties)描述测量标注矩阵L中每⼀个标注区域的⼀系列属性。
L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。
返回值STATS是⼀个长度为max(L(:))的结构数组,结构数组的相应域定义了每⼀个区域相应属性下的度量。
properties 可以是由逗号分割的字符串列表、饱含字符串的单元数组、单个字符串 'all' 或者 'basic'。
如果 properties 等于字符串 'all',则所有下述字串列表中的度量数据都将被计算,如果 properties 没有指定或者等于 'basic',则属性: 'Area', 'Centroid', 和 'BoundingBox' 将被计算。
下⾯的列表就是所有有效的属性字符串,它们⼤⼩写敏感并且可以缩写。
属性字符串列表Area EquivDiameter MajorAxisLengthBoundingBox EulerNumber MinorAxisLengthCentroid Extent OrientationConvexArea Extrema PixelIdxListConvexHull FilledArea PixelListConvexImage FilledImage SolidityEccentricity Image属性详细定义本部分将结合⼀个具体的例⼦说明各种字串相关属性的意义,矩阵取⾃在蚁蛉模式识别中做过预处理后的斑纹分割图像,如下图:这是⼀幅⼆值图像,在应⽤regionprops函数之前必须将其标注,可以调⽤ bwlabel函数和伪彩⾊处理,标注后的图像如下图:下⾯基于以上的材料来考察属性的含义。
逐次凸逼近算法代码逐次凸逼近算法(Sequential Convex Programming, 简称SCP)是一种求解非线性规划问题的有效算法。
SCP算法通过不断剖分一组凸包来逐渐逼近非凸问题的最优解。
以下是SCP算法的Python实现。
输入参数:- `f`: 目标函数- `G`: 约束条件- `x0`: 初始点- `tol`: 目标函数值的最大误差```import numpy as npfrom scipy.optimize import minimize_scalardef scp(f, G, x0, tol):n = len(x0) # 变量数量x = x0 # 初始点while True:# 计算凸包 vertices 和 coefvertices, coef = calc_convex_hull(f, G, x)# 计算在vertices上的最小函数值v_min = np.inffor vertex in vertices:v = f(vertex)if v < v_min:v_min = vx_min = vertex# 如果目标函数值满足要求,返回解if v_min < tol:return x_min# 寻找在凸包上最小的、与本次搜索方向相反的梯度grad_max = -np.inffor i in range(len(vertices)):grad = G(vertices[i]).dot(coef[i])if grad > grad_max:grad_max = gradx_max = vertices[i]# 用线性搜索找到下一个xdef df(alpha):return np.linalg.norm(G(x+alpha*(x_max-x)))res = minimize_scalar(df, bounds=(0,1), method='bounded')alpha = res.xx = x + alpha*(x_max-x)def calc_convex_hull(f, G, x):# 计算梯度和海森矩阵grad = G(x)hess = np.zeros((len(x),len(x)))for i in range(len(x)):hess[i,i] = np.sum(G.jacobian(x, i)**2)for j in range(i+1,len(x)):hess[i,j] = hess[j,i] = G.jacobian(x, i).dot(G.jacobian(x, j))# 计算梯度投影的y轴长度y = gradp = np.zeros_like(grad)for i in range(len(x)):d = grad[i]for j in range(i):d -= p[j]*hess[i,j]p[i] = d/hess[i,i]y -= p[i]*grad[i]y = np.sqrt((y**2).sum())# 计算凸包y_max = -np.infvertices_max = []for i in range(2**len(x)):x_i = np.array([int(a) for a in np.binary_repr(i, width=len(x))])if np.abs(x_i).sum()==1:if np.sign(x_i.dot(grad))==1:x_root = x - x_i*grad/hess.diagonal()x_vertex = scp(lambda v: -f(v), lambda v: -G.jacobian(v), x_root, tol=1e-6)y_vertex =-G(x_vertex).dot(grad)/np.sqrt(G(x_vertex).dot(hess).dot(G(x_vertex)))if y_vertex > y_max:y_max = y_vertexvertices_max = []if np.isclose(y_vertex, y_max):vertices_max.append(x_vertex)# 计算凸包边界coef = []vertices = vertices_max.copy()for i in range(len(vertices_max)):j = (i+1)%len(vertices_max)v =(vertices_max[j]-vertices_max[i])/np.linalg.norm(vertices_max[j]-vertices_max[ i])coef.append(-v.dot(grad))while True:# 找到第一个顶点k = Nonefor i in range(len(vertices)):n_i = (i-1)%len(vertices)v_i = vertices[i] - vertices[n_i]s_i = np.sign(coef[i]-coef[n_i])if np.linalg.norm(G(vertices[i])-G(vertices[n_i]))>1e-10:w_i =s_i*v_i.dot(G(vertices[i])-G(vertices[n_i]))/np.linalg.norm(G(vertices[i])-G(v ertices[n_i]))if w_i > 1e-8:k = ibreakif k is None:break# 找到下一个顶点k_next = Nonefor i in range(len(vertices)):if i==k: continuev_i = vertices[i] - vertices[k]s_i = np.sign(coef[i]-coef[k])if np.linalg.norm(G(vertices[i])-G(vertices[k]))>1e-10:w_i =s_i*v_i.dot(G(vertices[i])-G(vertices[k]))/np.linalg.norm(G(vertices[i])-G(ver tices[k]))if w_i > 1e-8:if k_next is None:k_next = icontinuev_k = vertices[k_next] - vertices[k]s_k = np.sign(coef[k_next]-coef[k])ifnp.linalg.norm(G(vertices[k_next])-G(vertices[k]))>1e-10:w_k =s_k*v_k.dot(G(vertices[k_next])-G(vertices[k]))/np.linalg.norm(G(vertices[k_ne xt])-G(vertices[k]))if w_k > w_i:k_next = iif k_next is None:breakvertices.insert(k_next if k_next<k else k+1,vertices[k]+v_i*w_i/(w_i-w_k))coef.insert(k_next if k_next<k else k+1,coef[k]+(coef[i]-coef[k])*w_i/(w_i-w_k))return vertices, coef```这个代码做了以下几件事情:1. `calc_convex_hull`: 对于当前解 `x`,计算出它所在点的基于梯度和海森矩阵的凸包 `vertices` 和对应的法向量`coef`。
Hive是基于Hadoop的数据仓库工具,支持SQL语句和类SQL语句,提供了一些空间函数,用于处理空间数据。
以下是常用的Hive空间函数:
1. ST_Area:计算几何图形的面积。
2. ST_Boundary:返回几何图形的边界。
3. ST_Centroid:计算几何图形的重心。
4. ST_ConvexHull:计算几何图形的凸壳。
5. ST_Contains:判断一个几何图形是否包含另一个几何图形。
6. ST_Crosses:判断两个几何图形是否交叉。
7. ST_Disjoint:判断两个几何图形是否不相交。
8. ST_Envelope:返回几何图形的最小外接矩形。
9. ST_Equals:判断两个几何图形是否相等。
10. ST_Intersects:判断两个几何图形是否交叉。
11. ST_PointOnSurface:返回几何图形表面上的一个点。
12. ST_SymDifference:返回两个几何图形的对称差集。
13. ST_Union:返回多个几何图形的并集。
14. ST_Within:判断一个几何图形是否在另一个几何图形内部。
15. ST_X:返回几何图形的x坐标。
16. ST_Y:返回几何图形的y坐标。
这些空间函数在处理空间数据时非常有用,例如可以用于计算地理区域的面积、周长、重心等信息,判断两个地理位置之间的距离、相交关系等。
OpenCV最大内切圆算法原理详解1. 引言最大内切圆是指在给定的轮廓中,能够与轮廓相切且具有最大半径的圆。
在计算机视觉和图像处理中,最大内切圆算法经常被用于形状分析、目标检测和轮廓匹配等应用。
OpenCV作为一个开源的计算机视觉库,提供了一系列用于图像处理和分析的函数和算法,其中也包括了计算最大内切圆的函数。
本文将详细介绍与OpenCV最大内切圆算法原理相关的基本原理,包括最大内切圆的定义、计算方法和实现步骤等内容。
2. 最大内切圆的定义最大内切圆是指在给定的轮廓中,能够与轮廓相切且具有最大半径的圆。
具体而言,对于一个给定的轮廓,最大内切圆的圆心位于轮廓内部,并且与轮廓的边界相切,同时其半径是所有与轮廓相切的圆中最大的。
3. 最大内切圆的计算方法计算最大内切圆的方法可以分为两步:首先,找到轮廓的凸包;然后,计算凸包的最大内切圆。
3.1 凸包的计算凸包是指包围给定点集合的最小凸多边形。
在计算最大内切圆之前,需要先计算轮廓的凸包。
OpenCV提供了函数cv2.convexHull()来计算凸包。
凸包的计算步骤如下: 1. 读入轮廓数据。
2. 使用cv2.convexHull()计算凸包。
3. 绘制凸包。
3.2 最大内切圆的计算在得到轮廓的凸包之后,可以计算凸包的最大内切圆。
最大内切圆的计算可以通过迭代法来实现。
最大内切圆的计算步骤如下: 1. 初始化最大内切圆的半径为0。
2. 对于凸包上的每个点,计算以该点为圆心的最大内切圆。
3. 如果计算得到的最大内切圆的半径大于当前的最大半径,则更新最大内切圆的半径和圆心。
4. 绘制最大内切圆。
4. OpenCV中计算最大内切圆的实现步骤在OpenCV中,可以使用以下步骤来计算最大内切圆: 1. 读入图像并进行预处理,如灰度化、二值化等。
2. 使用OpenCV函数cv2.findContours()找到图像中的轮廓。
3. 对于每个轮廓,使用cv2.convexHull()计算凸包。
Matlab中图片保存的四种方法一种是出来图形窗口后手动保存(这儿又可以分两种):1 直接从菜单保存,有fig,eps,jpeg,gif,png,bmp等格式。
2 edit------〉copy figure,再粘贴到其他程序。
另一种是用命令直接保存(这里也有两种):1 用saveas命令保存图片。
saveas的三个参数:(1)图形句柄,如果图形窗口标题栏是“Figure 3”,则句柄就是3.(2)文件名。
(3)单引号字符串,指定存储格式。
例:saveas(gcf,['D:\MATLAB7\work','yanbao',num2str(k),'.jpg']);2 使用plot函数后紧接着用print函数。
print的三个参数:(1)图形句柄,如果图形窗口标题栏是“Figure 3”,则句柄就是3.(2)单引号字符串,指定存储格式。
用gcf可以获取当前窗口句柄。
png格式:'-dpng'jpeg: '-djpeg',tiff: '-dtiff'bmp: '-dbitmap'(3)文件名。
例:>> x=-pi:2*pi/300:pi;>> y=sin(x);>> plot(x,y);>> print(gcf,'-dpng','abc.png') % 保存为png格式的图片。
>> figure(2) % 新建一个句柄为2的图形窗口。
>> plot(x,cos(x)); % 在句柄为2的图形窗口上画图。
>> grid>> print(2,'-djpeg','C:\abc.jpeg'); %将句柄为2的图形保存为jpeg/jpg格式的图片,文件名为'C:\abc.jpeg'。