Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 分离图像的组成部分并将其保存为新图像_Image_Matlab_Image Processing_Crop - Fatal编程技术网

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
问题 此代码分离并保存白色部分,但新图像中保存的白色部分的大小与原始图像中的相同。请参见下面的输出图像:

输出图像

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

问题: 如何修改上述代码以获得所需的输出图像?

步骤:
  • 找到白色部分的边界

  • 要包含黑色部分,请从左上角减去一个常数。如果它小于或等于零,则表示我们已达到或超过实际图像的左上角,因此将其设置为1。如果大于零,则一切正常

  • 对右下角进行类似的调整

  • 裁剪到所需的大小

  • 代码:
    %查找白色边界
    [~,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