MATLAB 路面异物检测代码错误及修正

错误原因: 在调用 rgb2gray 函数时,传入的参数 img 应为读入的图像数据,而不是图像路径。

修改方法: 将第五行的代码修改为 img_gray = imread('C:\Users\86132\Desktop\路面异物检测\数据\Rw277.jpg');,即可正确读入图像并转换为灰度图像。

修正后的代码:

% 读入图像
img = imread('C:\Users\86132\Desktop\路面异物检测\数据\Rw277.jpg', 'jpg');
% 将图像转换为灰度图像
img_gray = imread('C:\Users\86132\Desktop\路面异物检测\数据\Rw277.jpg');
if size(img_gray, 3) ~= 3
    img_gray = repmat(im2double(img_gray), [1 1 3]);
end
gray_img = rgb2gray(img_gray);
% 设定阈值和最小端点数
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

通过修正代码,即可成功将图像转换为灰度图像并完成后续的路面异物检测过程。

MATLAB 路面异物检测代码错误及修正

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

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