为什么使用imbinarize函数总是显示错误?

我想要提取这条黄色曲线,但是没有成功。


% 读取图像
img = imread('C:\Users\nangua\Desktop\1.jpg');

% 转换图像到 HSV 格式
hsv = rgb2hsv(img);

% 从HSV图像中提取黄色部分
ymin = 0.1;
ymax = 1;
smin = 0.4;
vmin = 0.5;
yellow = (hsv(:,:,1) >= ymin & hsv(:,:,1) <= ymax) & ...
         (hsv(:,:,2) >= smin) & (hsv(:,:,3) >= vmin);
     
% 将图像转换为二值图像
BW = imbinarize(yellow);

% 提取边界
B = bwboundaries(BW);

% 计算边界的凸包
CH = convhull(B{1}(:,2), B{1}(:,1));

% 计算区域属性并绘制结果
stats = regionprops('table', BW, 'BoundingBox');
figure, imshow(img), hold on
plot(B{1}(:,2), B{1}(:,1), 'LineWidth', 2)
plot(B{1}(CH,2), B{1}(CH,1), 'r-', 'LineWidth', 2);
width = abs(stats.BoundingBox(3));
text(B{1}(1,2)+20, B{1}(1,1)+20, sprintf('Width: %.2f pixels', width), 'Color', 'red', 'FontSize', 14);

% 计算弯曲曲线的内径
ch_area = polyarea(B{1}(CH,2), B{1}(CH,1));
area = bwarea(BW);
inner_diameter = 4*sqrt(ch_area/pi) - width;
text(B{1}(1,2)+20, B{1}(1,1)+40, sprintf('Inner Diameter: %.2f pixels', inner_diameter), 'Color', 'red', 'FontSize', 14);

img


img

基于Monster 组和GPT的调写:

  • 问题出在将黄色部分提取为二值图像时,用了imbinarize函数。imbinarize函数要求输入的图像类型为uint8、uint16、uint32、int8、int16、int32、single或double,但是你传入的图像类型为逻辑型(logical)。
  • 你可以把黄色部分的图像从逻辑型转换为灰度图像或其他支持的图像类型,然后再应用imbinarize函数。

以下是修改后的代码:

img

% 读取图像
img = imread('C:\Users\nangua\Desktop\1.jpg');

% 转换图像到 HSV 格式
hsv = rgb2hsv(img);

% 从HSV图像中提取黄色部分
ymin = 0.1;
ymax = 1;
smin = 0.4;
vmin = 0.5;
yellow = (hsv(:,:,1) >= ymin & hsv(:,:,1) <= ymax) & ...
         (hsv(:,:,2) >= smin) & (hsv(:,:,3) >= vmin);
     
% 将图像转换为灰度图像
grayImg = rgb2gray(img);

% 将灰度图像与黄色部分的逻辑图像相乘,提取黄色部分
yellowImg = grayImg .* uint8(yellow);

% 将图像转换为二值图像
threshold = graythresh(yellowImg);
BW = imbinarize(yellowImg, threshold);

% 提取边界
B = bwboundaries(BW);

% 计算边界的凸包
CH = convhull(B{1}(:,2), B{1}(:,1));

% 计算区域属性并绘制结果
stats = regionprops('table', BW, 'BoundingBox');
figure, imshow(img), hold on
plot(B{1}(:,2), B{1}(:,1), 'LineWidth', 2)
plot(B{1}(CH,2), B{1}(CH,1), 'r-', 'LineWidth', 2);
width = abs(stats.BoundingBox(3));
text(B{1}(1,2)+20, B{1}(1,1)+20, sprintf('Width: %.2f pixels', width), 'Color', 'red', 'FontSize', 14);

% 计算弯曲曲线的内径
ch_area = polyarea(B{1}(CH,2), B{1}(CH,1));
area = bwarea(BW);
inner_diameter = 4*sqrt(ch_area/pi) - width;
text(B{1}(1,2)+20, B{1}(1,1)+40, sprintf('Inner Diameter: %.2f pixels', inner_diameter), 'Color', 'red', 'FontSize', 14);

 
该回答引用ChatGPT
这可能是因为 imbinarize 函数缺少输入参数或参数不正确。请尝试修改以下行:


BW = imbinarize(yellow);

替换为以下代码:


level = graythresh(yellow);
BW = imbinarize(yellow,level);


这将使用 graythresh 函数计算阈值级别,并将其应用于二值化。如果仍然有问题,请确保您的 MATLAB 版本支持该函数并检查是否有任何打字错误。

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

可能是因为imbinarize函数需要 MATLAB R2015a版本或更高版本才能使用,如果您的 MATLAB 版本较旧,可以尝试使用其他二值化函数,例如graythresh或otsuthresh。此外,您可以尝试调整imbinarize函数的阈值参数来获得更好的结果。例如,可以尝试使用以下代码替换imbinarize函数:

level = graythresh(yellow);
BW = im2bw(yellow, level);

这将使用Otsu方法自动计算阈值。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在MATLAB中,"imbinarize"函数用于将图像转换为二值形式。然而,当使用该函数时,可能会遇到以下几种错误:

1、 "Undefined function 'imbinarize' for input arguments of type 'logical'": 这个错误通常是因为您的MATLAB版本太旧而没有实现"imbinarize"函数。请升级到支持该函数的版本。

2、 "Too many input arguments"或"Too few input arguments": "imbinarize"函数需要一个输入参数,即待转换为二值图像的图像。如果您提供了多个或少于一个输入参数,则会出现这些错误。

3、 "Expected input number 1, I, to be two-dimensional"或"Expected input number 1, I, to be grayscale or truecolor":这个错误通常是因为您提供了不正确的图像类型。"imbinarize"函数只接受灰度或真彩色图像。如果您提供了其他类型的图像,将会出现这些错误。

解决这些错误的方法取决于具体情况。如果您仍然无法解决问题,请提供更多详细信息,例如错误消息的完整文本,以便我们更好地帮助您解决问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢