我使用regionprops()
,但我收到以下代码的错误:
J = imread('E:\Canopy New Exp\Data Set\input.jpg');
I = rgb2gray(J);
BW = regionprops(J,'basic');
stats = regionprops('table',BW,'Centroid',...
'MajorAxisLength','MinorAxisLength');
centers = stats.Centroid;
diameters = mean([stats.MajorAxisLength stats.MinorAxisLength],2);
radii = diameters/2;
hold on;
viscircles(centers,radii);
hold off;
但我收到以下错误:
Error using regionprops
Expected input number 1, L, to be one of these types:
double, single, uint8, uint16, uint32, uint64, int8, int16, int32, int64
Instead its type was char.
Error in regionprops (line 142)
validateattributes(L, {'numeric'}, ...
Error in Untitled (line 8)
stats = regionprops('table',BW,'Centroid',...
有什么建议吗?
提前致谢!
答案 0 :(得分:3)
您正在执行regionprops
两次,第二次以'table'
作为第一个参数。 regionprops
期望将图片(黑白,连接组件或标记)作为第一个参数,这就是您收到错误type char
的原因。
而是将黑白(二进制)图像输入到regionprops
的一次调用,应该这样做:
thresh = graythresh(I); % get a threshold (you could just pick one)
I_BW = im2bw(I,thresh); % make the image binary with the given threshold
stats = regionprops(I_BW,'basic'); % do regionprops on the thresholded image
您还可以使用2个图像参数regionprops
进行操作,一个用于显示另一个图像参数的区域,因此您可以尝试使用以下regionprops
调用代替:
stats = regionprops(I_BW, J, 'basic');
答案 1 :(得分:1)
regionprops
输出一个对象,所以在上面代码示例的第三行中,您在J
上调用它,一个图像,这很好,并返回一个适当的对象BW
。但是在接下来的行中,您再次在BW
对象上调用它,这就是错误的来源。在连续对象上调用它两次没有意义,但更有可能的是,这不是你的意图,你打算先用im2bw
对图像进行二值化。
当您阅读matlab输出的错误消息时,请注意底线是代码中发生错误的行。如果你向matlab的内置函数之一提供了错误的输入(这是我自己经验中最常见的一种错误),那么直到你深入研究matlab的内部函数才会出错体现。
因此,从底部向上阅读错误报告,您将深入到调用堆栈中,直到顶行,这是“实际”错误。这条最高线为您提供了冲突的原因,这是故事的一半。然后,您可以将这一半带回代码行,看看它为什么会发生以及如何修复它。
答案 2 :(得分:1)
您可能正在为它提供RGB阵列NxMx3。根据文档,regionprops采用NxM二进制数组。