Image 分离图像的组成部分并将其保存为新图像
我有一个黑白图像,如下所示: 我想分离此图像的白色部分,然后将它们另存为单独的图像。此图像有四个白色部分。我想把它们分开并保存四个新的图像;每个都包含图像的白色部分 为了实现这一点,我编写了以下代码:Image 分离图像的组成部分并将其保存为新图像,image,matlab,image-processing,crop,Image,Matlab,Image Processing,Crop,我有一个黑白图像,如下所示: 我想分离此图像的白色部分,然后将它们另存为单独的图像。此图像有四个白色部分。我想把它们分开并保存四个新的图像;每个都包含图像的白色部分 为了实现这一点,我编写了以下代码: 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
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
问题
此代码分离并保存白色部分,但新图像中保存的白色部分的大小与原始图像中的相同。请参见下面的输出图像:
输出图像
所需输出图像
我希望输出图像包含原始图像白色部分的增大尺寸。以下是我想要的图片:
问题:
如何修改上述代码以获得所需的输出图像?步骤:
%查找白色边界
[~,c1]=find(thisBlob,1);[~,r1]=find(thisBlob',1);
[~,c2]=find(thisBlob,1,'last');[~,r2]=find(thisBlob.',1',last');
%进行调整以包括黑色部分
k=10;%定义最大黑色像素数的常数
mxlim=尺寸(X);%用于确认我们没有超出图像的边界
r1=r1-10;r1(r1mxlim(2))=mxlims(2);
%提取所需部分
thisBlob=thisBlob(r1:r2,c1:c2);
所提供图像的输出:
您可以通过更改代码中的常数k
来更改黑色像素数
当白色部分位于边缘时的测试用例: 要验证如果白色部分位于如下图所示的边缘上,它是否也起作用: 代码为上图提供以下输出:
实际上,您要执行的是在对象周围有一点跨度的裁剪。这可以通过使用
imcrop
轻松实现,您必须调用它来提供要保留的矩形
要识别矩形,请执行以下操作:
y轴
)李>
x轴
)李>
最大值-最小值计算矩形的宽度和高度
边距
(在我的示例中,我将其值设置为10
,但您可以完全控制它),因此必须将该边距
减去最小值,然后将其添加到最大值,但注意不要超出图像的边界(这就是小minmax
游戏开始的地方)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(非双关语)强制转换:double->int
,然后使用int->char array
。只需使用num2str
结果:
您希望在图像中保留多少黑色?与所需的输出图像中显示的一样多以精确的数字/像素进行定义。如果原始图像的边缘是白色,会怎么样?您是否仍希望在其侧面保留黑色?我不希望在白色部分周围显示固定数量的黑色像素。输出图像中的黑色像素t图像的大小应确保在图像的白色部分周围可以看到一些黑色。不,如果白色部分位于原始图像的边缘,我不想在侧面显示黑色。我是否需要将此代码添加到我的当前代码中,或者这是我可以用来代替我编写的代码的完整代码?@Nick the代码假定您已经分隔了白色部分,并解释了进一步的处理。您需要在行
filname=strcat(h,“\u Out.jpg”);
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