读取原始图像 img = imread7-1tif; 将图像二值化 bw_img = imbinarizeimg; 进行骨架化操作 skel_img = bwmorphbw_img skel Inf; 消除分支条纹 branchpoints = bwmorphskel_img branchpoints; endpoints = bwmorphskel_img endpoints; skel_
问题原因:bwmorph 函数要求输入为二维矩阵,但在这里输入的 skel_img 矩阵可能不是二维的。
修改后的代码:
img = imread('7-1.tif'); % 读取原始图像 bw_img = imbinarize(img); % 将图像二值化 skel_img = bwmorph(bw_img, 'skel', Inf); % 进行骨架化操作 branchpoints = bwmorph(skel_img, 'branchpoints'); endpoints = bwmorph(skel_img, 'endpoints'); skel_img = skel_img & ~(branchpoints | endpoints); skel_img = bwareaopen(skel_img, 3); % 消除小于3个像素的骨架区域
pixel_size = 0.0595; % 纳米/像素 skel_props = regionprops(skel_img, 'PixelList'); stripe_lengths = []; for i = 1:length(skel_props) stripe_pixels = skel_props(i).PixelList; if size(stripe_pixels, 1) >= 3 stripe_length = 0; for j = 1:size(stripe_pixels, 1) if j < size(stripe_pixels, 1) && abs(stripe_pixels(j, 1) - stripe_pixels(j+1, 1)) == 1 && abs(stripe_pixels(j, 2) - stripe_pixels(j+1, 2)) == 1 % 对角线像素长度为2倍像素大小 stripe_length = stripe_length + 2 * pixel_size; else stripe_length = stripe_length + pixel_size; end end if stripe_length >= 0.483 % 剔除长度小于0.483 nm的条纹 stripe_lengths(end+1) = stripe_length; end end end
mean_length = mean(stripe_lengths); max_length = max(stripe_lengths); min_length = min(stripe_lengths); num_stripes = length(stripe_lengths); figure; subplot(1, 2, 1); imshow(img); title('Original Image'); subplot(1, 2, 2); imshow(skel_img); title(sprintf('Skeletonized Image\n%d stripes found', num_stripes)); fprintf('Mean length: %.3f nm\n', mean_length); fprintf('Maximum length: %.3f nm\n', max_length); fprintf('Minimum length: %.3f nm\n', min_length);
在消除小于3个像素的骨架区域后,确保 skel_img 矩阵为二维矩阵,避免了 bwmorph 函数的错误使用。
原文地址: https://www.cveoy.top/t/topic/bA5r 著作权归作者所有。请勿转载和采集!