我有一个嘈杂的图像,有多个分开的圆形区域,模糊了。具有六个兴趣区域(ROI)的此类图像的示例是:
使用bwconncomp
和给定阈值,在Matlab中使用全局阈值分割此图像很容易。但是我希望设置一个固定阈值(例如54%)相对于每个ROI的最大像素值 (而不是整个图像) )细分每个投资回报率。
我有一组具有不同ROI大小和位置的图像,我需要根据基于区域的阈值对它们进行全部细分,因此我不能使用Matlab交互式工具来选择它们。
由于
答案 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。