【问题标题】:Matlab - crop image based on foreground-background segmentationMatlab - 基于前景 - 背景分割的裁剪图像
【发布时间】:2014-03-24 13:12:49
【问题描述】:

我有一个 RGB 图像,它被读取为具有 3 个维度的矩阵,img,我有一个表示图像分割的二进制掩码,mask

如何根据 matlab 中的二进制掩码裁剪图像? 我试图只选择二进制掩码标记的像素,但结果图像没有原始颜色。

centralPoints = find(mask > 0);
denoisedImage = zeros(424, 424, 3);
slice1 = zeros(424, 424);
origSlice = img(:, :, 1);
slice1(centralPoints) = origSlice(centralPoints);
slice2 = zeros(424, 424);
origSlice = img(:, :, 2);
slice2(centralPoints) = origSlice(centralPoints);
slice3 = zeros(424, 424);
origSlice = img(:, :, 3);
slice3(centralPoints) = origSlice(centralPoints);

denoisedImage(:, :, 1) = slice1;
denoisedImage(:, :, 2) = slice2;
denoisedImage(:, :, 3) = slice3;

这是代码。 img 是原始图像,centralPoints 是前景像素的坐标,denoisedImage 表示裁剪后的矩阵。

但是,denoisedImage 不会保留裁剪区域内原始图像的颜色。 前景像素不形成矩形区域,但它们形成一个连通分量。

【问题讨论】:

  • mask 是矩形的吗?
  • 不,mask不是矩形,而是连通的,所有的前景像素组成一个连通图组件。
  • 你说centralPoints代表坐标,那么是X-Y坐标的Nx2矩阵吗?
  • 我添加了一段代码,我在其中说明了我获得的坐标。
  • 这是因为denoisedImagedoubleimguint8。将denoisedImage 转换为uint8 后一切正常。谢谢!

标签: matlab


【解决方案1】:

你试过了吗

denoisedImage = bsxfun( @times, im2double(img), mask > 0 );

【讨论】:

  • OP 可能需要一些修改 - denoisedImage = uint8(bsxfun( @times, double(img), mask > 0 ));
  • @Divakar 请参阅my comment 询问使用的数据类型。应根据 OP 对该评论的回答进行更改。
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多