分离图像的组件并将它们保存为新图像

Separating the components of an image and saving them as new image

我有一张黑白图片,如下图:

我想分离这张图片的白色部分,然后将它们另存为单独的图片。此图像有四个白色部分。我想将它们分开并保存四个新图像;每个都包含图像的白色部分。

为了实现这个,我写了下面的代码:

BW=imread('img11_Inp.jpg');
imshow(BW);
BW=imbinarize(BW);

[L, num] = bwlabel(BW);
for k = 1 : num
    thisBlob = ismember(L, k);
    h = int2str(k);
    filname = strcat(h,'_Out.jpg');
    imwrite(thisBlob,filname);
    figure
    imshow(thisBlob, []);
end

问题

此代码将白色部分分离并保存,但新图像中保存的白色部分的大小与原始图像中的相同。请参阅下面的输出图像:

输出图像

所需的输出图像

我希望输出图像包含原始图像白色部分的增大尺寸。以下图片是我想要的:

问题

如何修改上面的代码以获得所需的输出图像?

步骤:

  1. 找到白色部分的边界

  2. 要包括黑色部分,左上角减去一个常数corner.If小于等于0,表示我们到达或超过了实际的左上角图片,所以设置为1。如果它大于零那么一切都很好。

  3. 对右下角进行类似的调整。

  4. 裁剪到所需大小。

代码:

%Finding the boundary of the white
[~, c1] = find(thisBlob, 1);             [~, r1] = find(thisBlob.', 1);
[~, c2] = find(thisBlob, 1, 'last');     [~, r2] = find(thisBlob.', 1, 'last');

%Making adjustments to include the black portion
k = 10;            %constant defining max number of black pixels
mxlim = size(X);   %to be used to confirm that we don't exceed the boundary of the image
r1 = r1-10;  r1(r1<=0)=1;                    c1 = c1-10;  c1(c1<=0)=1;
r2 = r2+10;  r2(r2>mxlims(1)) = mxlim(1);    c2 = c2+10;  c2(c2>mxlim(2)) = mxlims(2);

%Extracting the desired portion
thisBlob = thisBlob(r1:r2, c1:c2);

所提供图像的输出:

您可以通过更改代码中的常量k来更改黑色像素的数量。


白色部分在边缘时的测试用例:

要验证它是否也像这张图片那样位于边缘的白色部分:

代码为上图提供以下输出:

实际上,您要执行的是在对象周围有一点跨度的裁剪。这可以使用 imcrop 轻松实现,您必须调用它来提供要保留的矩形。

为了识别矩形:

  1. 查找包含白色像素 (y-axis) 的最小行和最大行;
  2. 查找包含白色像素 (x-axis) 的最小列和最大列;
  3. 使用maximum - minimum计算矩形的宽度和高度。
  4. 因为您想使用一点 margin 进行裁剪(在我的示例中我将其值设置为 10 但您可以完全控制它),您必须减去 margin到最小值并将其添加到最大值,但注意不要超出图像的边界(这就是 min-max 小游戏发挥作用的地方)。

这是完整的工作代码:

img = imread('img11_Inp.jpg');
imshow(img);

img_bin = imbinarize(img);
[lab,num] = bwlabel(img_bin);

span = 10;

for k = 1:num
    file = [num2str(k) '_Out.jpg'];

    blob = ismember(lab,k);
    blob_size = size(blob);

    col_idx = find(any(blob == true,1));
    x1 = max([1 (min(col_idx) - span)]);
    x2 = min([blob_size(2) (max(col_idx) + span)]);
    width = x2 - x1;

    row_idx = find(any(blob == true,2));
    y1 = max([1 (min(row_idx) - span)]);
    y2 = min([blob_size(1) (max(row_idx) + span)]);
    height = y2 - y1;

    blob_crop = imcrop(blob,[x1 y1 width height]);
    imwrite(blob_crop,file);

    figure();
    imshow(blob_crop,[]);
end

此外,不要使用 int2str(k) 来获取索引的字符串表示形式。您的索引实际上是一个 double,因此您强制执行双重(无双关语意)转换:double -> int,然后是 int -> char array。只需使用 num2str.

结果: