在Matlab中使用基于区域的阈值进行图像分割

时间:2015-05-11 16:05:48

标签: matlab image-processing image-segmentation threshold

我有一个嘈杂的图像,有多个分开的圆形区域,模糊了。具有六个兴趣区域(ROI)的此类图像的示例是:

enter image description here image source

使用bwconncomp和给定阈值,在Matlab中使用全局阈值分割此图像很容易。但是我希望设置一个固定阈值(例如54%)相对于每个ROI的最大像素值 (而不是整个图像) )细分每个投资回报率

我有一组具有不同ROI大小和位置的图像,我需要根据基于区域的阈值对它们进行全部细分,因此我不能使用Matlab交互式工具来选择它们。

由于

1 个答案:

答案 0 :(得分:0)

完成连接组件分析后,尝试使用bwlabel。它会将您的6个区域中的每个区域标记为1-6。然后使用每个区域/标签作为掩码。您只查看区域中的值并找到最大值

%after bwconncomp
lbls = bwlabel(my_bw_conn_output);
num_lbls = max(lbls(:));

percentage_of_max = 54;
my_thresh = zeros(1,num_lbls);

for ii=1:num_lbls
    %isolates only one ROI
    temp_mask = (lbls == ii);

    %we do two maxes, one for rows one for columns
    max_val = max(max(uint8(temp_mask) .* image_with_values_to_threshold));

    %this could be for color pictures too
    my_thresh(ii) = percentage_of_max * max_val
end

修改

如果你想直接使用你的bwconncomp的结果做一些更像这样的事情

%my code is written assuming you started with a grayscale image, though you
%could adapt it for a color image
cc = bwconncomp(grayscale_image);
percentage_of_max = 54;

for ii=1:cc.NumObjects
    mask = zeros(cc.ImageSize);

    %converts the indexes back to x,y coordinates
    [x_coords,y_coords] = ind2sub(cc.ImageSize,cc.PixelIdxList{ii}(:));
    mask(x_coords,y_coords) = 1;

    %masks the image
    roi_im = bsxfun(@times, uint8(mask), grayscale_image);

    %% do processing for this region here using roi_im 
    curr_thresh = max(roi_im (:)) * percentage_of_max;

    thesh_im = grayscale_image > curr_thresh;
end

另一种方法是裁剪图像,然后简单地在裁剪后的图像上运行计算。我jsut遇到了这个SO帖子 How to crop face section from an image with given corner points. MATLAB有助于裁剪完美的方块。如果您有另一个不是矩形的形状,也可以使用roipoly