图像预处理 -------------------------------------------------------------------------------- rgb2gray I = rgb2gray(RGB); -------------------------------------------------------------------------------- im2double I2 = im2double(I)%图像 I 转换为双精度值;I 可以是灰度强度图像、真彩色图像或二值图像。 I2 = im2double(I,'indexed')%图像 I 转换为双精度值,并根据需要偏移数据。 -------------------------------------------------------------------------------- imgaussfilt %高斯平滑处理 B = imgaussfilt(A)%过滤器图像A用2-d高斯平滑内核的0.5标准偏差,并返回由滤波后的图像 B。 B = imgaussfilt(A,sigma)%A使用具有指定标准偏差的二维高斯平滑内核 过滤图像sigma。(sigma默认0.5) B = imgaussfilt(___,Name,Value)%使用名称 - 值对参数来控制过滤的各个方面。 名称 - 值对参数 'FilterSize'- 高斯滤波器大小,指定为正,奇数整数的标量或2元素向量 B = imgaussfilt(A,'FilterSize',3); 'Padding'- 图像填充 值 描述 数字标量 垫图像与恒定值的元素。 'circular' 在尺寸内用圆形重复元素填充。 'replicate' 通过重复数组的边框元素来填充。 'symmetric' 垫镜像与自己的镜像反射。 B = imgaussfilt(A ,'Padding', 'circular'); 'FilterDomain'- 执行过滤的域 值 描述 'auto' 基于内部启发法在空间或频率域中执行卷积。 'frequency' 在频域中执行卷积。 'spatial' 在空间域中执行卷积。 B = imgaussfilt(A ,'FilterDomain', 'spatial'); -------------------------------------------------------------------------------- fspecial h = fspecial(type)%指定 的二维过滤器type h = fspecial('average',hsize)%平均过滤器 h = fspecial('disk',radius)%圆形平均滤波器 h = fspecial('gaussian',hsize,sigma)%具有标准偏差的旋转对称高斯低通滤波器,使用imgaussfilt或imgaussfilt3代替 h = fspecial('laplacian',alpha)%3乘3的滤波器,近似于二维拉普拉斯算子alpha的形状,控制拉普拉斯算子的形状 h = fspecial('log',hsize,sigma)%旋转对称的拉普拉斯高斯滤波器 h = fspecial('motion',len,theta)%用于与图像卷积后近似摄像机的线性运动;len指定运动的长度,并 theta以逆时针方向指定以度为单位的运动角度。 h = fspecial('prewitt')%3乘3的滤镜,通过近似垂直渐变来强调水平边缘 h = fspecial('sobel')%3乘3的滤镜,通过近似垂直渐变使用平滑效果强调水平边缘 %创建一个运动滤镜并使用它来模糊图像。显示模糊图像。 H = fspecial('motion',20,45); MotionBlur = imfilter(I,H,'replicate'); imshow(MotionBlur); %创建磁盘过滤器并使用它来模糊图像。显示模糊图像。 H = fspecial('disk',10); blurred = imfilter(I,H,'replicate'); imshow(blurred); 参数 type- 过滤器类型 值 描述 'average' 平均滤波器 'disk' 圆形平均滤波器(药盒) 'gaussian' 高斯低通滤波器。不建议。使用 imgaussfilt或imgaussfilt3代替。 'laplacian' 近似二维拉普拉斯算子 'log' 高斯滤波器的拉普拉斯算子 'motion' 近似摄像机的线性运动 'prewitt' Prewitt水平边缘强调滤镜 'sobel' Sobel水平边缘强调滤波器 hsize- 滤波器正整数的大小| 正整数的2元素向量 radius- 盘形滤波器的半径 5(默认)| 正数 sigma- 标准偏差 0.5(默认)| 正数 alpha- 拉普拉斯的形状 0.2(默认)| 范围内的标量[0 1] len- 摄像机的线性运动 9(默认)| 数字标量 theta- 相机运动角度 0(默认)| 数字标量 h- 相关核 矩阵 -------------------------------------------------------------------------------- imfilter B = imfilter(A,h)%A使用多维过滤 器过滤多维数组h并返回结果B B = imfilter(A,h,options,...)%据一个或多个指定选项执行多维过滤。 options- 控制过滤操作 字符向量 |的选项 字符串标量 | 数字标量 选项 描述 填充选项 数字标量, X 在数组边界之外的输入数组值被赋值 X。如果未指定填充选项,则默认为 0。 'symmetric' 通过镜像反射阵列边界上的数组来计算数组边界外的输入数组值。 'replicate' 假定数组边界外的输入数组值等于最近的数组边界值。 'circular' 通过隐式假设输入数组是周期性的,计算数组边界外的输入数组值。 输出尺寸 'same' 输出数组与输入数组的大小相同。如果未指定输出大小选项,则这是默认行为。 'full' 输出数组是完整的过滤结果,因此大于输入数组。 相关和卷积选项 'corr' imfilter使用相关执行多维过滤,这与filter2执行过滤的方式相同。如果未指定相关或卷积选项,则imfilter使用相关性。 'conv' imfilter 使用卷积执行多维过滤。 -------------------------------------------------------------------------------- edge BW = edge(I)% 返回BW包含1s 的二进制图像,其中函数在输入图像和 其他地方找到边。默认使用sobel BW = edge(I,method) BW = edge(I,method,threshold)%返回强于的所有边threshold。%指定要检测的边的方向。 %Sobel和Prewitt方法可以检测垂直方向,水平方向或两者的边缘。Roberts方法可以检测与水平成45°角,与水平成135°或两者成角度的边。 BW = edge(I,method,threshold,direction)%跳过边缘 - 阶段,这可以提高性能 BW = edge(___,'nothinning')%指定sigma过滤器的标准偏差。 BW = edge(I,method,threshold,sigma) BW = edge(I,method,threshold,h)%使用您指定的过滤器的方法 检测边缘 [BW,threshOut] = edge(___)%也返回阈值。 [BW,threshOut,Gv,Gh] = edge(___)%也返回方向梯度幅度。对于Sobel和Prewitt方法,Gv并Gh对应于垂直和水平梯度。对于罗伯茨方法, Gv并Gh分别对应于梯度在从水平的45°和135°的角度。 BW1 = edge(I,'Canny');%使用Canny方法查找边。 BW2 = edge(I,'Prewitt');%使用Prewitt方法查找边。 imshowpair(BW1,BW2,'montage');%并排显示两个结果。 method- 边缘检测方法 方法 描述 'Sobel' 使用Sobel对导数的近似,在图像的梯度最大的点处找到边I。 'Prewitt' 使用Prewitt逼近导数,在渐变最大的那些点处 找到边I。 'Roberts' 使用Roberts逼近导数,在渐变最大的那些点处 找到边I。 'log' 通过使用拉普拉斯高斯(LoG)滤波器进行滤波后查找零交叉来 查找边I。 'zerocross' 通过使用您指定的过滤器过滤后查找过零点来 查找边I, h 'Canny' 通过查找渐变的局部最大值来查找边I。该 函数使用高斯滤波器的导数计算梯度。该方法使用两个阈值来检测强和弱 的边缘,包括弱边缘如果它们连接到强的输出边缘edge。通过使用两个阈值,Canny方法比其他方法更不可能被噪声欺骗,并且更可能检测到真正的弱 边缘。 'approxcanny' 使用Canny 边缘检测算法的近似版本查找边缘,以不太精确的检测为代价提供更快的执行时间。预计浮点图像将在该范围内标准化。[0 1] threshold- 灵敏度阈值 数字标量 | 2元素向量 |[] direction- 要检测的边缘方向 'both'(默认)| 'horizontal'|'vertical' -------------------------------------------------------------------------------- vision.CascadeObjectDetector检测 detector = vision.CascadeObjectDetector%使用Viola-Jones算法创建一个检测器来检测对象。 detector = vision.CascadeObjectDetector(model) detector = vision.CascadeObjectDetector(XMLFILE)%创建一个检测器并将其配置为使用XMLFILE输入指定的自定义分类模型。 detector = vision.CascadeObjectDetector(Name,Value)%vision.CascadeObjectDetector('ClassificationModel','UpperBody') ClassificationModel- 训练级联分类模型 分类模型 图像尺寸用于训练模型 型号说明 'FrontalFaceCART'(默认) [20 20] 检测直立和前向的面部。该模型由弱分类器组成,基于分类和回归树分析(CART)。这些分类器使用Haar功能来编码面部特征。基于CART的分类器提供了模拟面部特征之间的高阶依赖性的能力。[1] 'FrontalFaceLBP' [24 24] 检测直立和前向的面部。该模型由弱分类器组成,基于决策树桩。这些分类器使用局部二进制模式(LBP)来编码面部特征。LBP功能可以提供抵抗照明变化的稳健性。[2] 'UpperBody' [18 22] 检测上身区域,定义为头肩区域。该模型使用Haar特征来编码头部和肩部区域的细节。因为它在头部周围使用了更多的特征,所以该模型对于姿势变化(例如头部旋转/倾斜)更加鲁棒。[3] 'EyePairBig''EyePairSmall' [11 45][5 22] 检测一双眼睛。该'EyePairSmall'模型是使用较小的图像训练。这使模型能够检测到比'EyePairBig'模型检测到的更小的眼睛。[4] 'LeftEye''RightEye' [12 18] 分别检测左眼和右眼。这些模型由弱分类器组成,基于决策树桩。这些分类器使用Haar功能来编码细节。[4] 'LeftEyeCART''RightEyeCART' [20 20] 分别检测左眼和右眼。构成这些模型的弱分类器是CART树。与决策树桩相比,基于CART树的分类器能够更好地模拟高阶依赖性。[5] 'ProfileFace' [20 20] 检测直立面部轮廓。该模型由弱分类器组成,基于决策树桩。这些分类器使用Haar功能对面部细节进行编码。 'Mouth' [15 25] 检测嘴巴。该模型由弱分类器组成,基于决策树桩,使用Haar功能对嘴部细节进行编码。[4] 'Nose' [15 18] 该模型由弱分类器组成,基于决策树桩,使用Haar功能对鼻子细节进行编码。[4] MergeThreshold- 检测阈值 4(默认)| 整数 检测阈值,指定为整数。阈值定义了在对象周围存在多个检测的区域中声明最终检测所需的标准。合并满足阈值的共同定位检测的组被合并以在目标对象周围产生一个边界框。增加该阈值可以通过要求在多尺度检测阶段期间多次检测目标对象来帮助抑制错误检测。将此属性设置为时 0,将返回所有检测,而不执行阈值处理或合并操作。此属性是可调的。 bbox = detector(I)%检测到的对象的M个边界框,四元素向量(x, y, width, length) bbox = detector(I,roi)% 检测由指定的矩形搜索区域内的对象 roi %用上半身分类模型检测图像中的上半身 %创建一个身体检测器对象并设置属性。 bodyDetector = vision。CascadeObjectDetector('UpperBody'); bodyDetector.MinSize = [60 60]; bodyDetector.MergeThreshold = 10; %读取输入图像并检测上半身。 I2 = imread('visionteam.jpg'); bboxBody = bodyDetector(I2); %注释检测到的上半身。 IBody = insertObjectAnnotation(I2,'rectangle',bboxBody,'Upper Body'); figure imshow(IBody) -------------------------------------------------------------------------------- vision.CascadeObjectDetector算法 全部收缩 分类模型训练 训练每个模型以检测特定类型的对象。通过从一组已知图像中提取特征来训练分类模型。然后将这些提取的特征馈入学习算法以训练分类模型。Computer Vision Toolbox™软件使用Viola-Jones级联对象检测器。该探测器使用HOG [7],LBP [8]和Haar-like [6]特征以及使用增强训练的级联分类器。 用于训练分类器的图像大小定义包含对象的最小区域。训练图像大小根据应用程序,目标对象的类型和可用的正图像而变化。必须将MinSize属性设置为大于或等于用于训练模型的图像大小的值。 分级器级联 该对象使用级联分类器来有效地处理图像区域以存在目标对象。级联中的每个阶段都应用越来越复杂的二元分类器,这允许算法快速拒绝不包含目标的区域。如果在级联中的任何阶段未找到所需对象,则检测器立即拒绝该区域并终止处理。通过终止,该对象避免在级联中进一步调用计算密集型分类器。 多尺度物体检测 检测器逐步缩放输入图像以定位目标对象。在每个比例增量处,滑动窗口(其大小与训练图像大小相同)扫描缩放图像以定位对象。该ScaleFactor属性确定连续增量之间的缩放量。 搜索区域大小与ScaleFactor以下方式相关: search region = round((ObjectTrainingSize)*(ScaleFactorN)) N是当前增量,大于零的整数, ObjectTrainingSize是用于训练分类模型的图像大小。 搜索窗口遍历每个缩放增量的图像。 MinSize,MaxSize和ScaleFactor之间的关系 了解要检测的对象大小与比例因子之间的关系将帮助您相应地设置属性。的MinSize和 MaxSize特性限制对象的大小范围来检测。理想情况下,在处理图像之前知道近似对象大小时,会修改这些属性以减少计算时间。它们的目的不是根据对象大小提供精确的结果过滤。这些属性的行为受ScaleFactor的影响。比例因子确定搜索窗口大小的量化。 搜索区域 = round((训练大小)*(ScaleFactorN)) 返回对象大小的实际范围可能与您为MinSize和MaxSize属性选择的不完全相同。例如, 对于具有24x24训练大小的ScaleFactor值 1.1,对于5 增量,搜索区域计算将为: >> search region = round(24*1.1.^(1:5)) >> 26 29 32 35 39 如果您要设置MaxSize为 34,由于搜索区域量化,算法使用的实际最大对象大小将是32。 合并检测阈值 对于每个比例增量,搜索窗口遍历图像,从而在目标对象周围产生多个检测。多个检测被合并到每个目标对象的一个边界框中。MergeThreshold在组合或拒绝检测之前,您可以使用该属性来控制所需的检测数。最终边界框的大小是各个检测的边界框大小的平均值,位于MinSize和 之间MaxSize。 -------------------------------------------------------------------------------- 霍夫变换 hough [H,theta,rho] = hough(BW)%该函数还返回标准霍夫变换,它是一个参数空间矩阵,其行和列分别对应于rho和theta值。 [H,theta,rho] = hough(BW,Name,Value,...)%命名参数影响计算 计算和显示霍夫变换 %读取图像,并将其转换为灰度图像。 RGB = imread('gantrycrane.png'); I = rgb2gray(RGB); %提取边缘。 BW = edge(I,'canny'); %计算霍夫变换 [H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89); %显示原始图像和霍夫矩阵。 subplot(2,1,1); imshow(RGB); title('gantrycrane.png'); subplot(2,1,2); imshow(imadjust(rescale(H)),'XData',T,'YData',R,... 'InitialMagnification','fit'); title('Hough transform of gantrycrane.png'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal, hold on; colormap(gca,hot); 在有限的Theta范围内计算霍夫变换 RGB = imread('gantrycrane.png'); I = rgb2gray(RGB); BW = edge(I,'canny'); %在有限的角度范围内计算霍夫变换。 [H,T,R] = hough(BW,'Theta',44:0.5:46); figure imshow(imadjust(rescale(H)),'XData',T,'YData',R,... 'InitialMagnification','fit'); title('Limited Theta Range Hough Transform of Gantrycrane Image'); xlabel('\theta') ylabel('\rho'); axis on, axis normal; colormap(gca,hot) 名称 - 值对参数 例: [H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',0.5); 'RhoResolution'- Hough变换箱沿rho轴的间距 1(默认) 'Theta'- 输出矩阵的相应列的Theta值 -90:89(默认) -------------------------------------------------------------------------------- hough算法 标准霍夫变换(SHT)使用线的参数表示: rho = x * cos(theta)+ y * sin(theta) 变量rho是沿垂直于线的矢量从原点到线的距离。theta是从正x轴以顺时针方向测量的从原点到线的垂直投影的角度。的范围THETA是- 90 ° ≤ θ < 90 °。线本身的角度是θ + 90 °,也是相对于正x轴顺时针测量的。 SHT是参数空间矩阵,其行和列分别对应于rho和theta值。SHT中的元素表示累加器单元。最初,每个单元格中的值为零。然后,对于图像中的每个非背景点,计算每个θ的rho。在SHT中,rho四舍五入到最近的允许行。累加器单元递增。在此过程结束时,值Q在SHT(R,C)表示Q的点XY上线-平面位于由指定THETA(C)和RHO(r)的。SHT中的峰值表示输入图像中的潜在线。 所述霍夫变换矩阵,H是nrho -by- ntheta其中: nrho = 2*(ceil(D/RhoResolution)) + 1,和 D = sqrt((numRowsInBW - 1)^2 + (numColsInBW - 1)^2)。 rho值范围从-diagonal到diagonal diagonal = RhoResolution*ceil(D/RhoResolution)。 ntheta = length(theta) -------------------------------------------------------------------------------- houghpeaks peaks = houghpeaks(H,numpeaks)%H在hough函数生成的霍夫变换矩阵中定位峰值。该函数返回peaks一个矩阵,用于保存峰的行和列坐标。 peaks = houghpeaks(___,Name,Value,...) 在旋转图像的Hough变换中定位和显示峰值 I = imread('circuit.tif'); BW = edge(imrotate(I,50,'crop'),'canny'); [H,T,R] = hough(BW);%创建图像的霍夫变换。 %在图像的霍夫变换中找到峰值并绘制。 P = houghpeaks(H,2);%2为峰值数量 imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal, hold on; plot(T(P(:,2)),R(P(:,1)),'s','color','white'); -------------------------------------------------------------------------------- houghlines lines = houghlines(BW,theta,rho,peaks)%返回值lines是一个结构数组,其长度等于找到的合并线段数。 lines = houghlines(___,Name,Value,...) I = imread('circuit.tif'); rotI = imrotate(I,33,'crop'); BW = edge(rotI,'canny'); [H,T,R] = hough(BW); imshow(H,[],'XData',T,'YData',R,... 'InitialMagnification','fit'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal, hold on; %在图像的霍夫变换中找到峰值。 P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); x = T(P(:,2)); y = R(P(:,1)); plot(x,y,'s','color','white'); %找到线条并绘制 lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); figure, imshow(rotI), hold on max_len = 0; for k = 1:length(lines) xy = [lines(k).point1; lines(k).point2]; plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); % Plot beginnings and ends of lines plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); % Determine the endpoints of the longest line segment len = norm(lines(k).point1 - lines(k).point2); if ( len > max_len) max_len = len; xy_long = xy; end end %通过将青色着色来突出显示最长的线段。 plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan'); 名称 - 值对参数 'MinLength'- 最小行长度 40(默认) 'FillGap'- 与相同的霍夫变换箱相关联的两个线段之间的距离 20(默认) lines 属性 描述 point1 [X Y]指定线段终点坐标的两个元素向量 point2 [X Y]指定线段终点坐标的两个元素向量 theta 霍夫变换箱的角度(以度为单位) rho rho 霍夫变换箱的轴位置 -------------------------------------------------------------------------------- imfindcircles centers = imfindcircles(A,radius)%找到A半径近似等于的图像中的圆圈radius。输出centers是一个双列矩阵,包含图像中圆心的x,y坐标。 [centers,radii] = imfindcircles(A,radiusRange)%找到半径在指定范围内的圆圈radiusRange。 [centers,radii,metric] = imfindcircles(A,radiusRange)%返回一个列向量,metric包含每个圆的累加器数组峰值的大小(按降序排列),圆强度 [___] = imfindcircles(___,Name,Value) 检测图像中的五个最强圆圈 A = imread('coins.png'); imshow(A) %找到r范围[15,30]范围内半径像素的所有圆圈。 [centers, radii, metric] = imfindcircles(A,[15 30]); %根据度量值保留五个最强的圆圈。 centersStrong5 = centers(1:5,:); radiiStrong5 = radii(1:5); metricStrong5 = metric(1:5); %在原始图像上绘制五个最强的圆周长。 viscircles(centersStrong5, radiiStrong5,'EdgeColor','b'); %找到半径范围内图像中的所有亮圆。 [centersBright,radiiBright] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','bright'); %找到半径范围内图像中的所有黑眼圈。 [centersDark,radiiDark] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','dark'); 名称 - 值对参数 'ObjectPolarity'- 对象极性 'bright'(默认) 对象极性指示圆形对象是否比背景更亮或更暗,指定为由'ObjectPolarity'下表中的值和任一值组成的逗号分隔对。 'bright' 圆形物体比背景更亮。 'dark' 圆形物体比背景暗。 'Method'- 计算方法 'PhaseCode'(默认) 计算方法是用于计算累加器数组的技术,指定为由'Method'下表中的值和任一值组成的逗号分隔对。 'PhaseCode' Atherton和Kerbyson的[1]相位编码方法。这是默认值。 'TwoStage' 该方法用于两阶段圆形Hough变换[2],[3]。 'Sensitivity'- 灵敏度系数 0.85(默认) 'EdgeThreshold'- 边界渐变阈值 数量,范围为[0。1] 提示 指定相对较小radiusRange以获得更好的准确性。一个好的经验法则是选择radiusRange这样的rmax < 3*rmin和(rmax-rmin) < 100。 imfindcircles当radius(或rmin)的值小于或等于5 时,精度受到限制。 如果使用(默认)'PhaseCode'方法而不是,则半径估计步骤通常会更快'TwoStage'。 两种计算方法,'PhaseCode'并且'TwoStage'在检测同心圆的能力方面受到限制。同心圆的结果可以根据输入图像而变化。 imfindcircles 没有找到中心位于图像域外的圆圈。 imfindcircles预处理二进制(逻辑)图像以提高结果的准确性。它rgb2gray在处理之前使用该函数将真彩色图像转换为灰度图像。 -------------------------------------------------------------------------------- 算法 imfindcircles使用基于圆形霍夫变换(CHT)的算法来查找图像中的圆。使用这种方法是因为它在存在噪声,遮挡和变化的照明时具有鲁棒性。 CHT不是严格指定的算法,而是在其实现中可以采用许多不同的方法。然而,总的来说,有三个基本步骤是共同的。 累加器阵列计算 高梯度的前景像素被指定为候选像素,并且允许在累加器阵列中投射“投票”。在经典的CHT实现中,候选像素以它们周围的模式投票,形成固定半径的整圆。图1a示出了位于实际圆(实心圆)上的候选像素和候选像素的经典CHT投票模式(虚线圆)的示例。 经典CHT投票模式 中心估算 属于图像圈的候选像素的投票倾向于累积在与圆的中心对应的累加器阵列仓处。因此,通过检测累加器阵列中的峰值来估计圆心。图1b示出了位于实际圆(实心圆)上的候选像素(实心点)的示例,以及它们在实际圆的中心重合的投票图案(虚线圆圈)。 半径估计 如果相同的累加器阵列用于多于一个半径值,如在CHT算法中通常所做的那样,则必须将检测到的圆的半径估计为单独的步骤。 imfindcircles提供了两种在图像中查找圆的算法:相位编码(默认)和两级。两者都有一些共同的计算步骤,但每个步骤都有自己独特的方面。 两种算法共有的常见计算功能如下: 使用二维累加器阵列 经典的Hough变换需要3-D阵列来存储多个半径的投票,这导致大的存储要求和长的处理时间。相位编码和两阶段方法都通过对所有半径使用单个2-D累加器阵列来解决此问题。虽然这种方法需要额外的半径估计步骤,但总体计算负荷通常较低,尤其是在大半径范围内工作时。这是现代CHT实施中广泛采用的实践。 使用边缘像素 总体内存需求和速度受候选像素数量的强烈支配。为了限制它们的数量,输入图像的梯度幅度是阈值,使得在计数投票中仅包括高梯度的像素。 使用边缘方向信息 优化性能的另一种方法是限制候选像素可用的二进制数。这是通过利用当地可用的边缘信息来实现的,只允许沿着梯度方向在有限的间隔内进行投票(图2)。 投票模式:沿着渐变方向的多个半径 rmin 最小搜索半径 rmax 最大搜索半径 ractual 候选像素所属的圆的半径 cmin 半径r min的圆心 cmax 径r max的圆心 cactual 半径r 实际的圆心 函数使用的两种CHT方法imfindcircles在计算圆半径的方式上基本不同。 两阶段 使用估计的圆心和图像信息明确地估计半径。该技术基于计算径向直方图[2] [3]。 相位编码 相位编码[1]中的关键思想是在累加器阵列中使用复数值,并在阵列条目的相位中编码半径信息。由边缘像素投射的投票不仅包含关于可能的中心位置的信息,还包含关于与中心位置相关联的圆的半径的信息。与必须使用径向直方图明确估计半径的两阶段方法不同,在相位编码中,可以通过简单地从累加器阵列中的估计中心位置解码相位信息来估计半径。 -------------------------------------------------------------------------------- 标记 rectangle rectangle('Position',pos)% pos 指定为 [x y w h] 形式的四元素向量,x y 确定位置,w h确定大小。当前坐标区中绘制图形,不清除现有内容。 rectangle('Position',pos,'Curvature',cur)%为矩形的边添加曲率。 cur 指定为 [horizontal vertical]. 0(无曲率)和 1(最大曲率) rectangle(___,Name,Value) rectangle(ax,___) r = rectangle(___) rectangle('Position',[1 2 5 6])% rectangle('Position',[0 0 2 4],'Curvature',0.2) rectangle('Position',pos,'Curvature',[1 1])%圆形 rectangle('Position',[1,2,5,10],'FaceColor',[0 .5 .5],'EdgeColor','b','LineWidth',3)%指定矩形轮廓和填充颜色 名称-值对组参数 'FaceColor' - 填充颜色 'none' (默认) 'EdgeColor' - 轮廓颜色 [0 0 0] (默认) 'LineStyle' - 线型 '-' (默认) -------------------------------------------------------------------------------- viscircles viscircles(centers,radii)%绘制圆圈与指定centers和radii 到当前轴。 viscircles(ax,centers,radii) viscircles(___,Name,Value) h = viscircles(___) 名称 - 值对参数 'EnhanceVisibility'- 增加具有对比特征的绘制圆圈以提高可见性 true(默认) 'Color'- 边界颜色 'red'(默认) 'LineStyle'- 圆边线条样式 '-'(默认) -------------------------------------------------------------------------------- insertObjectAnnotation RGB = insertObjectAnnotation(I,shape,position,label) RGB = insertObjectAnnotation(I,shape,position,label,Name,Value) insertObjectAnnotation(I,'rectangle',position,label)%指示的位置插入矩形和标签。 insertObjectAnnotation(I,'circle',position,label)%示的位置插入圆圈和相应的标签。 -------------------------------------------------------------------------------- 实际例子 img = imread('8.jpg'); img = im2double(rgb2gray(img)); imshow(img); img = edge(img); [centers radii] = imfindcircles(img, [10 40]);%半径范围 viscircles(centers, radii, 'EdgeColor', 'b');