MATLAB图像处理:提取长条纹并统计长度
binaryImage = imread('7-1.bmp');
grayImage = rgb2gray(binaryImage);
% 转换为灰度图像
threshold = graythresh(grayImage);
% 自适应阈值分割
binaryImage = imbinarize(grayImage, threshold);
skeletonImage = bwmorph(binaryImage, 'skel', Inf);
connectivity = bwconncomp(skeletonImage);
for i = 1:connectivity.NumObjects
if numel(connectivity.PixelIdxList{i}) >= 3
skeletonImage(connectivity.PixelIdxList{i}) = 0;
end
end
pixelSize = 0.0595;
stripeLengths = [];
for i = 1:connectivity.NumObjects
if numel(connectivity.PixelIdxList{i}) < 3
continue;
end
stripePixels = skeletonImage(connectivity.PixelIdxList{i});
stripeLength = sum(stripePixels) * pixelSize;
if any(stripePixels(:) > 1)
stripeLength = stripeLength + (sqrt(2) - 1) * sum(stripePixels(:)==2) * 2 * pixelSize;
end
stripeLengths(end+1) = stripeLength;
end
maxLength = round(0.483 / pixelSize);
longStripePixels = zeros(size(skeletonImage));
for i = 1:connectivity.NumObjects
if numel(connectivity.PixelIdxList{i}) < maxLength
continue;
end
longStripePixels(connectivity.PixelIdxList{i}) = skeletonImage(connectivity.PixelIdxList{i});
end
imwrite(longStripePixels, 'longStripePixels.png');
histogram(stripeLengths);
meanLength = mean(stripeLengths);
maxLength = max(stripeLengths);
minLength = min(stripeLengths);
代码修改说明:
代码修改前,stripeLength = stripeLength + (sqrt(2) - 1) * sum(stripePixels(:)==2) * 2 * pixelSize; 这行代码可能导致索引超出数组范围的错误,因为stripePixels(:) 中可能存在大于 1 的值。
为了解决这个问题,代码修改后添加了一个判断条件if any(stripePixels(:) > 1),只有当stripePixels(:) 中存在大于 1 的值时,才会执行stripeLength = stripeLength + (sqrt(2) - 1) * sum(stripePixels(:)==2) * 2 * pixelSize; 这行代码,从而避免索引超出数组范围的错误。
代码功能:
本代码使用MATLAB对图像进行处理,首先将图像转换为灰度图像,并使用自适应阈值分割将图像二值化。然后,利用骨架化和连通域分析提取图像中的长条纹,并统计其长度。最后,保存处理后的图像和长条纹长度的直方图。
代码流程:
- 读取图像并转换为灰度图像。
- 使用自适应阈值分割将图像二值化。
- 利用骨架化提取图像中的细线。
- 使用连通域分析找出所有长条纹。
- 统计每个长条纹的长度。
- 保存处理后的图像和长条纹长度的直方图。
代码应用场景:
本代码可以用于提取图像中的长条纹,并统计其长度,例如可以用于识别条形码、图像中的线条等。
原文地址: https://www.cveoy.top/t/topic/m03z 著作权归作者所有。请勿转载和采集!