本程序是一个基于阈值和最小端点数的路面异物检测程序。程序首先读入图像并将其转换为灰度图像,然后设定阈值和最小端点数。接下来,程序检测图像中的点坐标差值是否超过阈值,标记异物并显示坐标信息。最后,程序保存结果图像并显示标记端点后的图像。

% 读入图像 img = imread('C:\Users\86132\Desktop\路面异物检测\数据\Rw277.jpg', 'jpg'); % 将图像转换为灰度图像 gray_img = rgb2gray(img); % 设定阈值和最小端点数 threshold = 10; min_endpoints = 2; % 检测图像中的点坐标差值是否超过阈值 [row, col] = find(gray_img > threshold); diff_row = diff(row); diff_col = diff(col); diff = sqrt(diff_row.^2 + diff_col.^2); idx = find(diff > threshold); % 标记异物并显示坐标信息 num_endpoints = 0; for i = 1:length(idx) x1 = col(idx(i)); y1 = row(idx(i)); x2 = col(idx(i)+1); y2 = row(idx(i)+1+1);

% 如果当前点对应的线段为端点,则累加计数器
if is_endpoint([x1,y1],[x2,y2],diff,idx,i,min_endpoints)
    num_endpoints = num_endpoints + 1;
    
    % 在原始图像上标记端点
    img(y1-1:y1+1,x1-1:x1+1,:) = [255 0 0];
    img(y2-1:y2+1,x2-1:x2+1,:) = [255 0 0];
    
    % 显示坐标信息
    fprintf('端点 %d 的位置:%d,%d\n', num_endpoints, x1, y1);
end

end % 保存结果图像 imwrite(img, 'result.jpg'); % 显示标记异物后的图像 figure; imshow(img); title('标记端点后的图像');

% 判断是否为端点的函数 function is_endpt = is_endpoint(pt1, pt2, diff, idx, i, min_endpoints) % 初始化端点判断标志 is_endpt = false;

% 计算当前线段与邻近线段的夹角,如果夹角大于90度,说明是端点
if i == 1 || i == length(idx) || diff(i-1) < threshold || ...
    diff(i) < threshold || dot(diff(i-1:i), diff(i:i+1)) / ...
    (norm(diff(i-1:i)) * norm(diff(i:i+1))) <= -0.5
    % 检查当前点是否有足够多的相邻线段
    num_neighbors = sum(abs(idx-i) <= min_endpoints);
    if num_neighbors >= min_endpoints
        is_endpt = true;
    end
end

end

判断是否为端点的函数is_endpoint使用了三个关键步骤。首先,它计算当前线段与邻近线段的夹角,如果夹角大于90度,说明是端点。接下来,它检查当前点是否有足够多的相邻线段。最后,如果当前点满足以上两个条件,则被认为是端点。

基于阈值和最小端点数的路面异物检测程序

原文地址: https://www.cveoy.top/t/topic/mKhG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录