如何使几何形状检测吗?
94(30天)
显示旧的评论
给予polat
2015年12月27日
我有弹出菜单来检测形状。例如,我需要当我点击圆圈,圆圈将显示在axes2 rgb图像。我是新手,所以无法安排任何事情。谁能帮我吗?我上传代码。我想,你能理解我的意思是,当你检查颜色菜单代码。谢谢你!
接受的答案
图像分析
2015年12月29日
给予,因为你没有附上图片,回答你的问题我不得不写一个程序随机形状。请看附带的演示。它创建一个图像随机形状,然后计算圆的形状和指定形状的理论循环的形状是最接近实际形状的循环。我希望有一天我能添加另一个方法,我发现,数数山峰周边的质心的距离。现在,它将创建一个图像是这样的:
9日评论
图像分析
2015年12月31日
我不理解这个句子的语法:“我没有附加任何任何照片,因为它将上传任何不同”。这是否意味着你会或不会,将来随时上传图片,这样我可以帮助你吗?
你问“我需要当我点击圆圈,圆圈将显示在rgb图像axes2”,我发现你。如果你需要使用二进制图像圈的面具,你可以这样做:
%掩模图像使用bsxfun()函数
maskedRgbImage = bsxfun (@times rgbImage铸造(面具,“喜欢”rgbImage));
否则更详细地解释你问什么了。喜欢你真的做颜色分割,而不是形状分割吗?
图像分析
2015年12月31日
首先把你的形象变成一个二进制图像,这样你所要担心的形状。然后用我的形状代码二进制图像。
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%读入一个颜色形状演示图像。
文件夹= pwd;
baseFileName =“test.bmp”;
%得到完整的文件名,路径前缀。
fullFileName = fullfile(文件夹,baseFileName);
如果~存在(fullFileName“文件”)
%没有找到它。检查它的搜索路径。
fullFileName = baseFileName;%没有路径。
如果~存在(fullFileName“文件”)
%仍然没有找到它。提醒用户。
errorMessage = sprintf (错误:%年代并不存在。,fullFileName);
uiwait (warndlg (errorMessage));
返回;
结束
结束
rgbImage = imread (fullFileName);
%得到图像的尺寸。numberOfColorBands应该= 3。
(行、列,numberOfColorChannels) = (rgbImage)大小;
%显示原始彩色图像。
次要情节(2 2 1);
imshow (rgbImage);
标题(“原始彩色图像”,“字形大小”字形大小,“翻译”,“没有”);
%全屏放大图。
集(gcf,“单位”,“归一化”,“Outerposition”,(0,0,1,1));
%提取个人红、绿、蓝通道。
redChannel = rgbImage (:: 1);
greenChannel = rgbImage (:: 2);
blueChannel = rgbImage (:: 3);
%从左上角得到的颜色背景像素
backgroundRGB = impixel (rgbImage, 1, 1)
%得到一个二进制图像,这样我们只需要担心形状,而不是颜色。
binaryImage = ~ (redChannel = = backgroundRGB (1) & greenChannel = = backgroundRGB (2) & blueChannel = = backgroundRGB (3));
%显示二进制图像。
次要情节(2,2,2);
imshow (binaryImage);
标题(的二进制图像,“字形大小”字形大小,“翻译”,“没有”);
答案(1)
Banerjee Anindya
2019年5月17日
@image分析你的代码不工作!在pwd其显示错误. .你能修复它吗?
12个评论
图像分析
2019年5月17日
不幸的是
你忘了包括错误消息
(
所有
红色文本),因此推迟一个解决方案给你。
它为其他人工作。试试
> > = pwd的文件夹
在命令窗口,并告诉我们。pwd是一个内部函数,它应该为你工作,和每一个人。
Banerjee Anindya
2019年5月18日
改变basefile名称目标图像后,我得到的误差,
未定义的字形大小的函数或变量。
错误在u3(23行)
标题(“原始彩色图像”,“字形大小”字形大小,“翻译”,“没有”);
图像分析
2019年5月19日
编辑:图像分析
2019年5月19日
我现在的完整的演示“隐藏”在上面的评论。也许你看到的只是一个片段的公开评论。取消隐藏的评论,看看我附加的m文件的地方。无论如何,我也会附在这里。
你使用一个代码片段,字形大小没有定义。在我满m文件,我将(在这里,和之前)你会发现定义字形大小,但在代码中不是这样的。
无论如何,当你看到这样的一个错误,你应该意识到,MATLAB函数,标题(),是使用非常普遍的“名称、价值”配对,几乎所有函数使用。和字形大小值。自定义的错误消息告诉你不是,你必须为它定义。你可以将它设置为12或15或20或任何你想要的大小。例如:
字形大小= 20;%定义这个之前你叫标题()。
图像分析
2019年5月19日
不确定你的选择是什么,以及如何你想“检测图像从我们的选择”。有多少图片你有什么会让你发现在另一个图像?
我演示的合成图像创建工作。如果你的图片或“选择”是不同的比
您可能需要修改代码
与您的情况。
Banerjee Anindya
2019年5月20日
编辑:图像分析
2019年5月20日
我的意思是说,假设我想使用这段代码来检测任何任意形状图像从本地目录。在这种情况下,代码的一部分应该改变什么?
图像分析
2019年5月20日
看到它说:
%现在创建一个演示图片。
[binaryImage, numSidesCircularity] = CreateDemoImage ();
代码替换成任何你想要的代码创建一个二进制图像,例如阅读在你的图像与imread()和调用imbinarize()或无论你想做的。
Banerjee Anindya
2019年6月25日
我的代码替换
%现在创建一个演示图片。
[binaryImage, numSidesCircularity] = CreateDemoImage ();
-
binaryImage = imread (“C: \用户桌面\ \猎人\ C7.bmp”);
但是我的形状的图像不得到检测
我得到的误差,
错误在parse_inputs()函数在第206行。
错误信息:
数据集必须包含至少3个样品。
错误在54行在u3()函数。
错误信息:
指数超过矩阵维度。
> >
还有2个警告对话框,请帮帮我!
图像分析
2019年6月26日
你forrgot附加c7.bmp。很有可能是一个灰度或RGB彩色图像,而不是一个二进制图像。你需要的阈值
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%读入图像演示。
grayImage = imread (fullFileName);
%得到图像的尺寸。
(行、列,numberOfColorChannels) =大小(binaryImage)
如果numberOfColorChannels > 1
grayImage = rgb2gray (grayImage);
结束
%转换为二进制的阈值
binaryImage = grayImage < someThreshold;%你需要替换someThreshold实际价值。
%显示图象。
次要情节(2、3、2);
imshow (binaryImage []);
impixelinfo;
轴(“上”,“图像”);
标题= sprintf (“原始图像:% d % d列的行、行、列);
标题(标题,“字形大小”字形大小,“翻译”,“没有”);
惠普= impixelinfo ();%设置状态栏看到当你鼠标值图像。
Banerjee Anindya
2019年6月26日
似乎没有改善!这是我的全部代码连同c7.bmp的图像文件
%演示找到特定形状的图像根据其形状(循环)和数量的顶点。
函数shape_recognition_demo1
试一试
clc;%清除命令窗口。
关闭所有;%关闭所有数据(除了imtool。)
工作空间;%确定工作区面板显示。
字形大小= 15;
%作为参考,计算的理论循环一群普通的多边形
%与不同数量的从3(三角形)。
dividingValues = PlotTheoreticalCircularity;
%让最后一分价值无穷因为任何循环从.99999到无穷大应该是一个圆。
%,有时你有循环超过1由于量化误差。
dividingValues(结束)=正;
%现在创建一个演示图片。
binaryImage = imread (“C: \用户桌面\ \猎人\ C7.bmp”);
%计算形状的数量
[~,numShapes] = bwlabel (binaryImage);
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%读入图像演示。
grayImage = imread (“C: \用户桌面\ \猎人\ C7.bmp”);
%得到图像的尺寸。
(行、列,numberOfColorChannels) =大小(binaryImage)
如果numberOfColorChannels > 1
grayImage = rgb2gray (grayImage);
结束
%转换为二进制的阈值
binaryImage = grayImage < 120;%你需要替换someThreshold实际价值。
%显示图象。
次要情节(2、3、2);
imshow (binaryImage []);
impixelinfo;
轴(“上”,“图像”);
标题= sprintf (“原始图像:% d % d列的行、行、列);
标题(标题,“字形大小”字形大小,“翻译”,“没有”);
惠普= impixelinfo ();%设置状态栏看到当你鼠标值图像。
%显示多边形图像演示。
次要情节(1、2、1);
imshow (binaryImage);
标题= sprintf (“图像% d形状”,numShapes);
标题(标题,“字形大小”、字形大小);
持有在;%,这样文本标签就不会吹走的形象。
%设置图属性:
%全屏放大图。
集(gcf,“单位”,“归一化”,“OuterPosition”,(0 0 1 1));
%去掉工具栏和下拉菜单的图。
%设置(gcf“工具栏”,“没有”,“菜单”,“没有一个”);
%的标题栏提供一个名称。
集(gcf,“名字”,“由ImageAnalyst演示”,“NumberTitle”,“关闭”)
drawnow;%显示立即。
[labeledImage, numberOfObjects] = bwlabel (binaryImage);
blobMeasurements = regionprops (labeledImage,“周长”,“区域”,“重心”,“图像”);
现在%计算顶点的数量通过观察的山峰一块质心的距离。
numSidesDistance = FindNumberOfVertices (blobMeasurements labeledImage);
%得到所有方便的测量成单个数组。
allAreas = [blobMeasurements.Area];
allPerimeters = [blobMeasurements.Perimeter];
圆=(4 *π* allAreas)。/ allPerimeters。^ 2
%增加循环的顺序排序
[sortedCircularities,排序方式]=排序(循环,“提升”);
%所有测量以同样的方式。
blobMeasurements = blobMeasurements(排序方式);
allAreas = allAreas(排序方式);
allPerimeters = allPerimeters(排序方式);
numSidesDistance = numSidesDistance(排序方式);
%绘制条形图的循环。
次要情节(1、2、2);
酒吧(sortedCircularities);
ylim ([0.55, 1.1]);
网格在;
标题(实际测量圆的,“字形大小”、字形大小);
%计算领域一种不同的方式。regionprops返回的“区域”的计算像素的数量。
%这有时会高估了这个地区。让我们用bwarea,计算区域上
% pixel-center像素中心的基础。
为k = 1: numberOfObjects
thisBlob = blobMeasurements (k) .Image;
allBwAreas (k) = bwarea (thisBlob);
结束
bwCircularities =(4 *π* allBwAreas)。/ allPerimeters。^ 2
sortedCircularities = bwCircularities
%设置红色水平线分隔的值
持有在;
xl = xlim ();
为k = 1:长度(numSidesCircularity) 1
thisSideLength = numSidesCircularity (k);
thisDividingValue = dividingValues (thisSideLength);
线(xl [thisDividingValue thisDividingValue),“颜色”,“r”);
%第一6、打印分度值在左边上方。
% 6后它会太拥挤
如果k < = 6
theLabel = sprintf (把价值= % .4f ',thisDividingValue);
thisDividingValue文本(xl (1) + 0.1 + 0.005, theLabel,“颜色”,“r”);
结束
结束
%解释为什么标签可能并不准确。
消息= sprintf (之前我们开始分类形状,\ nnote循环可能偏离理论循环\ ndepend大小,旋转,以及算法\新加坡国立大学计算面积和周长。);
流(“% s \ n”,消息);
uiwait (helpdlg(消息));
%说它们是什么,一个接一个。
次要情节(1、2、1);
为blobNumber = 1: numberOfObjects
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%确定大小根据循环的数量
%得到这个特定的blob的循环。
thisCircularity = sortedCircularities (blobNumber);
%看到哪些理论分度值小于。
%这将决定双方的数量。
numSidesCircularity =找到(thisCircularity < dividingValues 1“第一”);
%分配一个字符串命名的形状根据距离算法。
如果numSidesCircularity = = 3
% Blob有3个方面。
theShapeCirc =“三角形”;
elseifnumSidesCircularity = = 4
% Blob有4个方面。
theShapeCirc =“广场”;
elseifnumSidesCircularity = = 5
%团有5个方面。
theShapeCirc =“五角大楼”;
elseifnumSidesCircularity = = 6
% Blob有6面。
theShapeCirc =“六角”;
其他的
% Blob 7或更多。
theShapeCirc =近圆形的;
结束
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%确定的数量根据centroid-to-perimeter算法
%的形状进行分类centroid-to-perimeter算法似乎比循环算法更准确。
numSidesDist = numSidesDistance (blobNumber);
%分配一个字符串命名的形状根据距离算法。
如果numSidesDist = = 3
% Blob有3个方面。
theShapeDistance =“三角形”;
elseifnumSidesDist = = 4
% Blob有4个方面。
theShapeDistance =“广场”;
elseifnumSidesDist = = 5
%团有5个方面。
theShapeDistance =“五角大楼”;
elseifnumSidesDist = = 6
% Blob有6面。
theShapeDistance =“六角”;
其他的
% Blob 7或更多。
theShapeDistance =近圆形的;
结束
%在形状上放置一个标签
xCentroid = blobMeasurements (blobNumber) .Centroid (1);
yCentroid = blobMeasurements (blobNumber) .Centroid (2);
blobLabel = sprintf (# % d = %年代”、blobNumber theShapeDistance);
情节(xCentroid yCentroid,' r + ',“线宽”2,“MarkerSize”15);
文本(xCentroid + 20, yCentroid blobLabel,“字形大小”字形大小,“颜色”,“r”,“FontWeight”,“大胆”);
%通知用户循环和形状是什么。
distanceMessage = sprintf (“centroid-to-perimeter算法预测# % d % d形状,所以它预测的形状是一个% s的、blobNumber numSidesDistance (blobNumber) theShapeDistance);
circMessage = sprintf (对象的循环# % d %。3 f,所以循环算法预测对象是一个% s形状。\ nIt估计% d。% s \ n(范围是[%。4 f - % .4f]。)”,…
blobNumber、thisCircularity theShapeCirc numSidesCircularity,…
theShapeDistance dividingValues (numSidesCircularity - 1), dividingValues (numSidesCircularity));
%看看两边的数量确定每个方式互相同意。
如果numSidesDistance (blobNumber) = = numSidesCircularity
agreementMessage = sprintf (”团# % d,这两个算法% d方面达成一致。”、blobNumber numSidesCircularity);
其他的
agreementMessage = sprintf (”团# % d有分歧。”,blobNumber);
结束
%将所有消息合并成一个步骤。
promptMessage = sprintf (' % s \ n \ n % s \ n \ n % s的,circMessage distanceMessage agreementMessage);
流(“% s \ n”promptMessage);
%给用户一个机会,如果他们想要救助。
titleBarCaption =“继续?”;
按钮= questdlg (promptMessage titleBarCaption,“继续”,“退出”,“继续”);
如果strcmpi(按钮,“退出”)
返回;
结束
结束
uiwait (helpdlg (“完成了演示!”));
抓我
errorMessage = sprintf (的误差函数% s()行% d。\ n \ nError信息:\ n % s’,…
ME.stack (1) . name, ME.stack (1)。线,ME.message);
流(1,“% s \ n”,errorMessage);
uiwait (warndlg (errorMessage));
结束
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%与指定数量的圈子里创建一个图像,三角形,长方形,五角大楼
函数[binaryImage, numSides] = CreateDemoImage ()
试一试
行= 800;
列=圆(行* 3/4);% 4/3长宽比。
图;
%创建一个图像和加入一些三角形在不同的角度和不同的大小。
binaryImage = false(行、列);
numShapesToPlace = 3;
为numSides = 3: 6
shapesPlacedSoFar = 0;
centroidToVertexDistance = (75);
%定义故障安全参数。
maxNumberOfAttempts = 50;
numberOfAttempts = 0;
而shapesPlacedSoFar < numShapesToPlace & & numberOfAttempts < maxNumberOfAttempts
thisBinaryImage = CreatePolygon (numSides centroidToVertexDistance,行、列);
%有时将相邻两个多边形但不重叠。
然而bwlabel %()和bwconncomp()会考虑这两个区域是同一地区。
%来检查,防止这样的情况(这在我身上发生过一次),
%,我们需要扩张的二进制图像检查前一层重叠。
dilatedImage = imdilate (thisBinaryImage,真正的(9));
%查看是否有任何在这个二进制图像重叠的任何现有的像素像素。
overlapImage = binaryImage & dilatedImage;
如果~任何(overlapImage (:))
%没有像素重叠,所以还是在这个形象。
binaryImage = binaryImage | thisBinaryImage;
shapesPlacedSoFar = shapesPlacedSoFar + 1;
其他的
流(“跳过尝试% d,因为重叠。\ n ',numberOfAttempts);
结束
numberOfAttempts = numberOfAttempts + 1;
结束
结束
%在某些圈子里创建一个图像,并添加不同的角度和不同的大小。
numShapesToPlace = 3;
shapesPlacedSoFar = 0;
numSides = 30;%很圆
centroidToVertexDistance = (75);
而shapesPlacedSoFar < numShapesToPlace & & numberOfAttempts < maxNumberOfAttempts
thisBinaryImage = CreatePolygon (numSides centroidToVertexDistance,行、列);
%查看是否有任何在这个二进制图像重叠的任何现有的像素像素。
overlapImage = binaryImage & thisBinaryImage;
如果~任何(overlapImage (:))
%没有像素重叠,所以还是在这个形象。
binaryImage = binaryImage | thisBinaryImage;
shapesPlacedSoFar = shapesPlacedSoFar + 1;
结束
numberOfAttempts = numberOfAttempts + 1;
结束
%回传的数量我们决定使用。
numSides =(三6、30);
抓我
errorMessage = sprintf (的误差函数% s()行% d。\ n \ nError信息:\ n % s’,…
ME.stack (1) . name, ME.stack (1)。线,ME.message);
流(1,“% s \ n”,errorMessage);
uiwait (warndlg (errorMessage));
结束
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%创建一个多边形与双方的指定数量的二进制图像指定行和列的数量。
% centroidToVertexDistance是每个顶点重心的距离。
%如果centroidToVertexDistance长度2向量,那么这表明最小和最大范围和规模
%,它将创建一个随机大小多边形之间的最小和最大距离。
函数binaryImage = CreatePolygon (numSides centroidToVertexDistance,行、列)
试一试
%的范围大小从中心到顶点。
如果长度(centroidToVertexDistance) > 1
%随机大小之间的最小和最大距离。
minDistance = centroidToVertexDistance (1);
maxDistance = centroidToVertexDistance (2);
其他的
%都是一样的尺寸。
minDistance = centroidToVertexDistance;
maxDistance = centroidToVertexDistance;
结束
thisDistance = (maxDistance - minDistance) *兰德(1)+ minDistance;
%创建一个多边形在原点
为v = 1: numSides
角= v * 360 / numSides;
x (v) = thisDistance * cosd(角);
y (v) = thisDistance *信德(角);
结束
%做最后一点与第一个相同
x(结束+ 1)= x (1);
(结束+ 1)= y (1);
%的阴谋(x, y, b * -,“线宽”,2);
%网格;
%轴图像;
%旋转由0到360之间的一个随机角坐标
angleToRotate = 360 *兰德(1);
rotationMatrix = [cosd (angleToRotate)信德(angleToRotate);信德(angleToRotate) cosd (angleToRotate)];
%做实际的旋转
xy = (x, y);% numSides * 2矩阵;
xyRotated = xy * rotationMatrix;% numSides * 2矩阵乘以一个2 * 2 = numSides * 2矩阵。
x = xyRotated (: 1);%提取出x作为numSides * 2矩阵。
y = xyRotated (:, 2);%提取出y作为numSides * 2矩阵。
% centroidToVertexDistance之间得到一个随机的中心位置和(列- centroidToVertexDistance)。
%这将确保它总是在图像。
xCenter = thisDistance +(列- 2 * thisDistance) *兰德(1);
% centroidToVertexDistance之间得到一个随机的中心位置(行- centroidToVertexDistance)。
%这将确保它总是在图像。
yCenter = thisDistance +(行- 2 * thisDistance) *兰德(1);
%将图像的中心是在(xCenter yCenter)而不是在(0,0)。
x = x + xCenter;
y = y + yCenter;
binaryImage = poly2mask (x, y,行、列);
抓我
errorMessage = sprintf (的误差函数% s()行% d。\ n \ nError信息:\ n % s’,…
ME.stack (1) . name, ME.stack (1)。线,ME.message);
流(1,“% s \ n”,errorMessage);
uiwait (warndlg (errorMessage));
结束
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% https://en.wikipedia.org/wiki/Regular_polygon
%的说= (1/4)* n * s ^ 2 *床(π/ n)
函数圆= ComputeTheoreticalCircularity (numSides)
试一试
sideLength = 1;
周长= numSides * sideLength;
面积= (1/4)* numSides * sideLength ^ 2 / tan(π/ numSides);
圆=(4 *π*区)/周长^ 2;
抓我
errorMessage = sprintf (的误差函数% s()行% d。\ n \ nError信息:\ n % s’,…
ME.stack (1) . name, ME.stack (1)。线,ME.message);
流(1,“% s \ n”,errorMessage);
uiwait (warndlg (errorMessage));
结束
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%使图的理论循环一堆不同数量的绘制。
函数dividingValues = PlotTheoreticalCircularity ()
试一试
dividingValues = [];%初始化
字形大小= 24;
%作为参考,计算的理论循环一群经常与不同数量的多边形。
流(“双方理论循环\ n”);
%定义数组的数量方面我们要计算的循环。
numSides = 3: 16;
为k = 1:长度(numSides)
thisSideLength = numSides (k);
%计算理论上完美的循环,如果多边形是完美的,而不是数字化。
循环(k) = ComputeTheoreticalCircularity (thisSideLength);
结束
%的阴谋理论循环曲线交叉。
情节(numSides,循环,“b + - - - - - -”,“线宽”2,“MarkerSize”,20);
网格在;
持有在;
xl = xlim ();%左右的x坐标图。
%的阴谋理论在深红色的线。
darkRed = (0.85, 0, 0);
为k = 1:长度(numSides)
%进行理论线情节在一个红色的颜色。
线(xl,循环(k),循环(k)),“颜色”darkRed,“线宽”2);
流(“% d % f \ n”、thisSideLength循环(k));
如果k < 7%只打印文本和接近如果不是太拥挤了。
%使文本的真正价值
消息= sprintf (的理论价值% = % .4f ' d方面、thisSideLength循环(k));
文本(xl(1) + 0.1,循环(k) + 0.005,消息,“颜色”,darkRed);
结束
结束
%设置图属性:
%全屏放大图。
集(gcf,“单位”,“归一化”,“OuterPosition”,(0 0 1 1));
%去掉工具栏和下拉菜单的图。
%设置(gcf“工具栏”,“没有”,“菜单”,“没有一个”);
%的标题栏提供一个名称。
集(gcf,“名字”,“由ImageAnalyst演示”,“NumberTitle”,“关闭”)
drawnow;%显示立即。
标题(“理论循环”,“字形大小”字形大小,“翻译”,“没有”);
包含(边的数量,“字形大小”、字形大小);
ylabel (“真正的循环”,“字形大小”、字形大小);
%的中点之间的一个圆和一个用于下一个更多的方面。
dividingValues = conv(循环,(1,- 1)/ 2,“有效”);
%前置两个零,我们可以使用这个数组作为查找表我们经过的地方
%的数量作为指数,它告诉我们之间的分度值
%的边和一个超过这一数字。
%为例,现在dividingValues(1)给了我们3和4之间的分度值
%和dividingValues(3)给出了分度值之间的5和6之间(而不是3和4)。
dividingValues = (0, 0, dividingValues);
%现在dividingValues(3)会给我们3和4之间的分度值。
%设置红色水平线分隔的值
持有在;
xl = xlim ();
暗绿色= [0,0.5,0];
为k = 1:长度(numSides) 1
thisSideLength = numSides (k);
thisDividingValue = dividingValues (thisSideLength);
h =线(xl [thisDividingValue thisDividingValue),“颜色”暗绿色,“线宽”2,“线型”,“——”);
% h。线型=“-”;
%第一6、打印分度值在左边上方。
% 6后它会太拥挤
如果k < = 6
theLabel = sprintf (把价值= % .4f ',thisDividingValue);
thisDividingValue文本(xl (1) + 0.1 + 0.005, theLabel,“颜色”、暗绿色);
结束
结束
抓我
errorMessage = sprintf (的误差函数% s()行% d。\ n \ nError信息:\ n % s’,…
ME.stack (1) . name, ME.stack (1)。线,ME.message);
流(1,“% s \ n”,errorMessage);
uiwait (warndlg (errorMessage));
结束
现在%计算顶点的数量通过观察的山峰一块质心的距离。
函数numVertices = FindNumberOfVertices (blobMeasurements labeledImage)
试一试
numVertices = 0;%初始化。
%得到图像中气泡的数量。
numRegions =长度(blobMeasurements);
hFig =图;
promptUser = true;%让用户看到曲线。
%为每一个blob,边界,并找到每个边界点的质心的距离。
为k = 1: numRegions
%提取一个blob。
thisBlob = ismember (labeledImage, k) > 0;
如果promptUser%让用户看到的图像。
班;
imshow (thisBlob);
结束
%的边界
thisBoundary = bwboundaries (thisBlob);
thisBoundary = cell2mat (thisBoundary);%将从细胞转换成双。
%得到x和y
x = thisBoundary (:, 2);
y = thisBoundary (: 1);
%的重心
xCenter = blobMeasurements (k) .Centroid (1);
yCenter = blobMeasurements (k) .Centroid (2);
%计算距离
距离=√(x - xCenter)。^ 2 + (y - yCenter) ^ 2);
如果promptUser%让用户看到曲线。
%画出距离。
情节(距离,“b -”,“线宽”3);
网格在;
消息= sprintf (周边的质心距离形状# % d '、k);
标题(消息,“字形大小”15);
%范围y轴
yl = ylim ();
ylim ([0, yl型(2)]);%设置下限为0。
结束
%找到山峰的范围
peakRange = max(距离)- min(距离);
minPeakHeight = 0.5 * peakRange;
%的山峰
[peakValues, peakIndexes] = findpeaks(距离,“MinPeakProminence”,minPeakHeight);
%找到valueys。
[valleyValues, valleyIndexes] = findpeaks(距离,“MinPeakProminence”,minPeakHeight);
numVertices (k) = max([长度(peakValues), (valleyValues)]);
%的圈子里似乎有大量的山峰由于很小的范围和quanitization的形象。
%如果峰的数量超过了10个,零来表示一个圆。
如果numVertices (k) > 10
numVertices (k) = 0;
结束
如果promptUser%让用户看到曲线。
%画出峰。
持有在;
情节(peakIndexes距离(peakIndexes),“r ^”,“MarkerSize”10“线宽”2);
%画出山谷。
持有在;
情节(valleyIndexes距离(valleyIndexes),“房车”,“MarkerSize”10“线宽”2);
消息= sprintf (周边的质心距离形状# % d。发现% d峰”。k numVertices (k));
标题(消息,“字形大小”,20);
%的图un-maximizes每次当我们调用cla,让我们再次最大化。
%设置图属性:
%全屏放大图。
集(gcf,“单位”,“归一化”,“OuterPosition”,(0 0 1 1));
%去掉工具栏和下拉菜单的图。
%设置(gcf“工具栏”,“没有”,“菜单”,“没有一个”);
%的标题栏提供一个名称。
集(gcf,“名字”,“由ImageAnalyst演示”,“NumberTitle”,“关闭”)
%让用户看到这个形状绘制在继续之前的距离。
promptMessage = sprintf (“你想继续处理,\也取消处理吗?”);
titleBarCaption =“继续?”;
按钮= questdlg (promptMessage titleBarCaption,“继续”,“取消”,“继续”);
如果strcmpi(按钮,“取消”)
promptUser = false;
结束
结束
结束
关闭(hFig);
抓我
errorMessage = sprintf (的误差函数% s()行% d。\ n \ nError信息:\ n % s’,…
ME.stack (1) . name, ME.stack (1)。线,ME.message);
流(1,“% s \ n”,errorMessage);
uiwait (warndlg (errorMessage));
结束
另请参阅
标签
s manbetx 845
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
你也可以从下面的列表中选择一个网站
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。