分离图像的组件并将它们保存为新图像
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
问题
此代码将白色部分分离并保存,但新图像中保存的白色部分的大小与原始图像中的相同。请参阅下面的输出图像:
输出图像
所需的输出图像
我希望输出图像包含原始图像白色部分的增大尺寸。以下图片是我想要的:
问题
如何修改上面的代码以获得所需的输出图像?
步骤:
找到白色部分的边界
要包括黑色部分,左上角减去一个常数corner.If小于等于0,表示我们到达或超过了实际的左上角图片,所以设置为1。如果它大于零那么一切都很好。
对右下角进行类似的调整。
裁剪到所需大小。
代码:
%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
轻松实现,您必须调用它来提供要保留的矩形。
为了识别矩形:
- 查找包含白色像素 (
y-axis
) 的最小行和最大行;
- 查找包含白色像素 (
x-axis
) 的最小列和最大列;
- 使用
maximum - minimum
计算矩形的宽度和高度。
- 因为您想使用一点
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
.
结果:
我有一张黑白图片,如下图:
我想分离这张图片的白色部分,然后将它们另存为单独的图片。此图像有四个白色部分。我想将它们分开并保存四个新图像;每个都包含图像的白色部分。
为了实现这个,我写了下面的代码:
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
问题
此代码将白色部分分离并保存,但新图像中保存的白色部分的大小与原始图像中的相同。请参阅下面的输出图像:
输出图像
所需的输出图像
我希望输出图像包含原始图像白色部分的增大尺寸。以下图片是我想要的:
问题
如何修改上面的代码以获得所需的输出图像?
步骤:
找到白色部分的边界
要包括黑色部分,左上角减去一个常数corner.If小于等于0,表示我们到达或超过了实际的左上角图片,所以设置为1。如果它大于零那么一切都很好。
对右下角进行类似的调整。
裁剪到所需大小。
代码:
%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
轻松实现,您必须调用它来提供要保留的矩形。
为了识别矩形:
- 查找包含白色像素 (
y-axis
) 的最小行和最大行; - 查找包含白色像素 (
x-axis
) 的最小列和最大列; - 使用
maximum - minimum
计算矩形的宽度和高度。 - 因为您想使用一点
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
.
结果: