Matlab 转换面片图像

Matlab 转换面片图像,matlab,image-processing,deep-learning,Matlab,Image Processing,Deep Learning,我有一个代码,可以从给定的图像中心坐标中找到单个面片。我想转换它,这样它就能找到大小为32X32、步幅为16的多个补丁。补丁应该来自图像,而不是来自边框或背景 centerCoord = [70,125]; patchSize = 32; patchSourceImage = im(centerCoord(1)-ceil(patchSize/2):centerCoord(1)+ceil(patchSize/2)-1,centerCoord(2)-ceil(patchSize/2):centerC

我有一个代码,可以从给定的图像中心坐标中找到单个面片。我想转换它,这样它就能找到大小为32X32、步幅为16的多个补丁。补丁应该来自图像,而不是来自边框或背景

centerCoord = [70,125];
patchSize = 32;
patchSourceImage = im(centerCoord(1)-ceil(patchSize/2):centerCoord(1)+ceil(patchSize/2)-1,centerCoord(2)-ceil(patchSize/2):centerCoord(2)+ceil(patchSize/2)-1);

您的代码行很大,即使它可以工作,我建议您简化代码,这样您就可以检查补丁的某些区域(我们称之为感兴趣区域ROI)是否在图像之外

例如:

im = rand(150, 150);    % 150x150 random "image"
[nrows, ncols] = size(im);

% center coordinates of 4 Patches
centerCoord = [50,50; 100,50; 50,100; 100,100];
patchSize = 32;

% results will be stored in matrix Patches
Patches = zeros(patchSize, patchSize, size(centerCoord,1));

for i=1:size(centerCoord,1)
    top_left = ceil(centerCoord(i,:) - [patchSize/2, patchSize/2]);
    bottom_right = top_left + [patchSize-1, patchSize-1];

    if any(top_left <= 0) || any((bottom_right - [nrows, ncols]) > 0)
        %some regions of the patch fall outside the image. Handle this case here.
    else
        Patches(:,:,i) = im(top_left(1):bottom_right(1), top_left(2):bottom_right(2));
    end
end
im=rand(150150);%150x150随机“图像”
[nrows,ncols]=尺寸(im);
%4个面片的中心坐标
centerCoord=[50,50;100,50;50100;100100];
斑块大小=32;
%结果将存储在矩阵补丁中
补丁=零(补丁大小,补丁大小,大小(centerCoord,1));
对于i=1:大小(中心坐标,1)
左上=ceil(centerCoord(i,:)-[patchSize/2,patchSize/2]);
右下=左上+[patchSize-1,patchSize-1];
如果有(左上角0)
%面片的某些区域位于图像之外。在这里处理这个案子。
其他的
面片(:,:,i)=im(左上(1):右下(1),左上(2):右下(2));
结束
结束

这里的补丁是一个32x32x4矩阵,包含您的4个补丁。

您的代码行很大,即使它可以工作,我建议您简化代码,这样您就可以检查补丁的某些区域(我们称之为感兴趣区域ROI)是否位于图像之外

im = imread('image98.jpeg');   
 % 150x150 random "image"
 [nrows, ncols] = size(im);

 % center coordinates of 4 Patches
 centerCoord = [75 125];
 patchSize = 32;

 % results will be stored in matrix Patches

 for r=1:16:nrows
     for c =1:16:ncols
     top_left = ceil(centerCoord(1) - [patchSize/2, patchSize/2]);
     bottom_right = top_left + [patchSize-1, patchSize-1];

     if any(top_left <= 0) || any((bottom_right - [nrows, ncols]) > 0)
         fprint('Outside');
     else
        patch = im(centerCoord(1)-ceil(patchSize/2):centerCoord(1)+ceil(patchSize/2)-1,centerCoord(2)- ceil(patchSize/2):centerCoord(2)+ceil(patchSize/2)-1);
         imshow(patch)
         centerCoord(2) =centerCoord(2)+16;
     end
      centerCoord(1) =centerCoord(1)+16
     end
 end
例如:

im = rand(150, 150);    % 150x150 random "image"
[nrows, ncols] = size(im);

% center coordinates of 4 Patches
centerCoord = [50,50; 100,50; 50,100; 100,100];
patchSize = 32;

% results will be stored in matrix Patches
Patches = zeros(patchSize, patchSize, size(centerCoord,1));

for i=1:size(centerCoord,1)
    top_left = ceil(centerCoord(i,:) - [patchSize/2, patchSize/2]);
    bottom_right = top_left + [patchSize-1, patchSize-1];

    if any(top_left <= 0) || any((bottom_right - [nrows, ncols]) > 0)
        %some regions of the patch fall outside the image. Handle this case here.
    else
        Patches(:,:,i) = im(top_left(1):bottom_right(1), top_left(2):bottom_right(2));
    end
end
im=rand(150150);%150x150随机“图像”
[nrows,ncols]=尺寸(im);
%4个面片的中心坐标
centerCoord=[50,50;100,50;50100;100100];
斑块大小=32;
%结果将存储在矩阵补丁中
补丁=零(补丁大小,补丁大小,大小(centerCoord,1));
对于i=1:大小(中心坐标,1)
左上=ceil(centerCoord(i,:)-[patchSize/2,patchSize/2]);
右下=左上+[patchSize-1,patchSize-1];
如果有(左上角0)
%面片的某些区域位于图像之外。在这里处理这个案子。
其他的
面片(:,:,i)=im(左上(1):右下(1),左上(2):右下(2));
结束
结束
这里的补丁是一个32x32x4矩阵,包含4个补丁。

im=imread('image98.jpeg');
im = imread('image98.jpeg');   
 % 150x150 random "image"
 [nrows, ncols] = size(im);

 % center coordinates of 4 Patches
 centerCoord = [75 125];
 patchSize = 32;

 % results will be stored in matrix Patches

 for r=1:16:nrows
     for c =1:16:ncols
     top_left = ceil(centerCoord(1) - [patchSize/2, patchSize/2]);
     bottom_right = top_left + [patchSize-1, patchSize-1];

     if any(top_left <= 0) || any((bottom_right - [nrows, ncols]) > 0)
         fprint('Outside');
     else
        patch = im(centerCoord(1)-ceil(patchSize/2):centerCoord(1)+ceil(patchSize/2)-1,centerCoord(2)- ceil(patchSize/2):centerCoord(2)+ceil(patchSize/2)-1);
         imshow(patch)
         centerCoord(2) =centerCoord(2)+16;
     end
      centerCoord(1) =centerCoord(1)+16
     end
 end
%150x150随机“图像” [nrows,ncols]=尺寸(im); %4个面片的中心坐标 centerCoord=[75 125]; 斑块大小=32; %结果将存储在矩阵补丁中 对于r=1:16:nrows 对于c=1:16:ncols 左上=天花板(中心坐标(1)-[patchSize/2,patchSize/2]); 右下=左上+[patchSize-1,patchSize-1]; 如果有(左上角0) fprint(“外部”); 其他的 补丁=im(centerCoord(1)-ceil(补丁大小/2):centerCoord(1)+ceil(补丁大小/2)-1,centerCoord(2)-ceil(补丁大小/2):centerCoord(2)+ceil(补丁大小/2)-1; imshow(补丁) 中心合作社(2)=中心合作社(2)+16; 结束 中心合作社(1)=中心合作社(1)+16 结束 结束
im=imread('image98.jpeg');
%150x150随机“图像”
[nrows,ncols]=尺寸(im);
%4个面片的中心坐标
centerCoord=[75 125];
斑块大小=32;
%结果将存储在矩阵补丁中
对于r=1:16:nrows
对于c=1:16:ncols
左上=天花板(中心坐标(1)-[patchSize/2,patchSize/2]);
右下=左上+[patchSize-1,patchSize-1];
如果有(左上角0)
fprint(“外部”);
其他的
补丁=im(centerCoord(1)-ceil(补丁大小/2):centerCoord(1)+ceil(补丁大小/2)-1,centerCoord(2)-ceil(补丁大小/2):centerCoord(2)+ceil(补丁大小/2)-1;
imshow(补丁)
中心合作社(2)=中心合作社(2)+16;
结束
中心合作社(1)=中心合作社(1)+16
结束
结束

将您的
centerCoord
转换为存储每个补丁中心的矩阵。然后将代码应用于每个修补程序并将其存储(因为每个修补程序的大小相同,所以可以将修补程序存储在(32 x 32 x Npatches)矩阵中)将
centerCoord
转换为存储每个修补程序中心的矩阵。然后将代码应用到每个修补程序并存储(因为每个修补程序的大小相同,所以可以将修补程序存储在(32 x 32 x Npatches)矩阵中)我正在尝试类似的方法,但它只运行迭代,然后显示索引错误超过矩阵维度。你能把代码和循环放在一起吗?谢谢,但对我来说,补丁的数量从一开始就没有定义。我只知道我的图像的中心,比如[75 125],然后动态地遍历所有图像,通过更新中心创建整个图像的32*32的补丁。我可以移动的步幅是16。然后只需为
x=1:16:ncols
做一个循环,为
y=1:16:nrows
做另一个循环,然后使用[x y]作为补丁的中心。其中一些将不会完全落入图像中,并将激活我的代码中的
if
子句。丢弃此零件或根据需要处理它们。您要做的是称为“滑动窗口”,通常最好使用左上角作为参考,而不是补丁的中心。将我的代码添加到答案。。。在第一次迭代后,它会越界。我正在尝试类似的方法,但它只在迭代中运行,然后它显示索引的错误超过了矩阵的维度。你能把代码和循环放在一起吗?谢谢,但对我来说,补丁的数量从一开始就没有定义。我只知道我的图像的中心,比如[75 125],然后动态地遍历所有图像,通过更新中心创建整个图像的32*32的补丁。我可以移动的步幅是16。然后只需为
x=1:16:ncols
做一个循环,为
y=1:16:nrows
做另一个循环,然后使用[x y]作为补丁的中心。其中一些将不会完全落入图像中,并将激活我的代码中的
if
子句。丢弃此零件或根据需要处理它们。您要做的是所谓的“滑动窗口”,通常最好使用左上角作为参考,而不是零件的中心