当前位置: 首页 > 知识库问答 >
问题:

Matlab中基于区域阈值的图像分割

艾心远
2023-03-14

我有一个有多个分离的圆形区域的噪声图像是模糊的。具有六个感兴趣区域(ROI)的这种图像的示例是:

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

我有一组不同ROI大小和位置的图像,我需要基于区域阈值分割来分割它们,因此我也无法使用Matlab交互工具来选择它们。

谢谢

共有1个答案

松秦斩
2023-03-14

完成连接组件分析之后,尝试使用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遇到了这样一个帖子,如何从一个给定角点的图像中裁剪面部部分。帮助裁剪完美正方形的MATLAB。如果有另一个不是矩形的形状,也可以使用roipoly。

 类似资料:
  • 图像阈值 目标 在本教程中,您将学习简单阈值处理,自适应阈值处理,Otsu阈值处理等。 您将学习以下函数:cv2.threshold, cv2.adaptiveThreshold等。 一、单的阈值 在这里,事情是直截了当的。如果像素值大于阈值,则为其分配一个值(可以是白色),否则为其分配另一个值(可以是黑色)。使用的函数是cv2.threshold。第一个参数是源图像,它应该是灰度图像。第二个参数

  • 有哪些可能的方法来计算图像中非白色区域/灰色/黑色斑块的表面积?我尝试了来获取形状,在轮廓上迭代,并使用和求出总面积和周长,但结果似乎与图像无关。 我也尝试在轮廓之前添加一个精明的边缘检测,但似乎仍然不太好用。 只是一个额外的上下文,我想使用表面积作为一个ML模型的特性)。

  • 目标 在本教程中,您将学习简单阈值,自适应阈值和Otsu阈值。 你将学习函数cv.threshold和cv.adaptiveThreshold。 简单阈值 在这里,问题直截了当。对于每个像素,应用相同的阈值。如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。函数cv.threshold用于应用阈值。第一个参数是源图像,它应该是灰度图像。第二个参数是阈值,用于对像素值进行分类。第三个参数是分

  • 从原始图像中我们可以看到,我的ROI是白色的棉花圈在红色的边界中。当我分割这幅图像时,我得到了如图所示的二值图像。我们注意到,与原始图像相比,二值图像中存在一些缺失区域。因此,我要计算ROI的原始图像的像素数和二值图像中白点的像素数。这样我就可以计算ROI的实际像素和实际分割的像素数量的差异。 谢谢你。

  • 如何设置模糊图像的阈值以使数字尽可能清晰? 在之前的一篇文章中,我尝试自适应地对模糊的图像进行阈值化(左),这导致数字失真和断开连接(右): 从那时起,我尝试使用本文中描述的形态学关闭操作来使图像的亮度均匀: 如果我自适应地设置此图像的阈值,则不会得到明显更好的结果。但是,由于亮度大致一致,我现在可以使用普通阈值: 这比以前好多了,但我有两个问题: 我必须手动选择阈值。虽然关闭操作会产生均匀的亮度

  • 我需要在MATLAB中实现一个基于连通分量算法原理的图像分割函数,但需要做一些修改。这是为了非常简单的2D图像,有一个背景颜色和一些不同颜色的对象。 其思想是,将图像作为一个矩阵,我提供了一个选择背景颜色的工具(它将对每个图像变化)。然后,当图像的背景颜色的值被选中时,我要对图像中的所有对象进行分割,结果应该是一个带标签的矩阵,图像大小相同,背景为0,每个对象有不同的数字。 这是我的意思的一个生动