如何在MATLAB中查找黑白图像边界上的液滴起始点x坐标
MATLAB批量检测液滴接触点x坐标实现方案
以下是可落地的实现步骤,适配绝大多数水平承载台的液滴观测图像场景:
1. 批量读取图像并做预处理
- 首先定位待处理图像文件夹,用
dir函数批量读取所有图像路径:% 替换为你的图像文件夹路径 img_dir = 'D:\droplet_images\'; img_list = dir(fullfile(img_dir, '*.jpg')); % 初始化结果存储矩阵:列分别为文件名、左接触点x、右接触点x result = cell(length(img_list), 3); - 单张图像预处理:转灰度、去噪、对比度校正
for i = 1:length(img_list) img = imread(fullfile(img_dir, img_list(i).name)); if size(img,3) == 3 img_gray = rgb2gray(img); else img_gray = img; end % 中值滤波去噪 img_filter = medfilt2(img_gray, [3,3]); % 光照不均校正(可选,适用于明暗差异大的图像) img_adjust = imtophat(img_filter, strel('disk', 15));
2. 提取承载台基线
- 用Canny算子检测边缘,霍夫变换提取最长水平直线作为基线:
% 边缘检测 edge_img = edge(img_adjust, 'canny', [0.2, 0.5]); % 霍夫变换找水平直线,限制角度范围避免识别到斜向干扰边 [H, theta, rho] = hough(edge_img, 'Theta', -1:0.5:1); peaks = houghpeaks(H, 2); lines = houghlines(edge_img, theta, rho, peaks, 'FillGap', 20, 'MinLength', 100); % 取最长的线作为基线,记录基线y坐标 [~, max_line_idx] = max([lines.point2(1) - lines.point1(1)]); base_y = lines(max_line_idx).point1(2);
3. 计算液滴接触点x坐标
- 筛选液滴轮廓,找和基线y坐标匹配的左右端点:
% 去除基线对应的边缘,仅保留液滴轮廓 edge_img(base_y-2:base_y+2, :) = 0; droplet_region = bwconncomp(edge_img); [~, max_region_idx] = max(cellfun(@length, droplet_region.PixelIdxList)); [droplet_y, droplet_x] = ind2sub(size(edge_img), droplet_region.PixelIdxList{max_region_idx}); % 找距离基线误差在2像素内的液滴边缘点,取x的左右极值为接触点坐标 y_diff = abs(droplet_y - base_y); contact_points_idx = find(y_diff <= 2); contact_x = droplet_x(contact_points_idx); left_x = min(contact_x); right_x = max(contact_x); % 存储结果 result{i,1} = img_list(i).name; result{i,2} = left_x; result{i,3} = right_x; end - 最后导出结果到csv文件即可:
writecell(result, 'droplet_contact_x.csv');
如果你的图像中承载台不是完全水平,可以在提取基线后计算基线倾斜角度,用
imrotate校正图像后再做后续处理,精度更高。
如果液滴轮廓存在拖尾等异常,可以提前设定液滴的感兴趣区域(ROI),排除基线下方、液滴外的干扰区域,进一步降低误判概率
内容的提问来源于stack exchange,提问作者jesse voorn
相关产品推荐
相关产品推荐

