【问题标题】:Matlab - remove image border using logical indexingMatlab - 使用逻辑索引删除图像边框
【发布时间】:2014-06-12 21:33:06
【问题描述】:

我有一张视网膜眼底图像,其边角有一个白色边框。我正在尝试删除图像所有四个边的边框。这是一个预处理步骤,我的图像如下所示:

fundus http://snag.gy/XLGkC.jpg

这是一个 RGB 图像,我采用绿色通道,并使用逻辑索引创建了一个蒙版。我搜索了图像中全黑的像素,并侵蚀了蒙版以去除白色边缘像素。但是,我不知道如何检索最终图像,没有使用我拥有的蒙版的白色像素边框。这是我的代码,任何帮助将不胜感激:

maskIdx = rgb(:,:,2) == 0;   # rgb is the original image
se = strel('disk',3);        # erode 3-pixel using a disk structuring element 
im2 = imerode(maskIdx, se);
newrgb = rgb(im2);           # gives a vector - not the same size as original im

【问题讨论】:

    标签: matlab


    【解决方案1】:

    自己解决了。这是我在一些帮助下所做的。

    我首先计算了所有三个颜色通道组合的遮罩。这是因为当单独应用于所有三个通道时,每个通道的掩码并不相同,如果我只使用原始图像中一个通道的掩码,则最终图像中会留下残留像素:

    mask = (rgb(:,:,1) == 0) & (rgb(:,:,2) == 0) & (rgb(:,:,3) == 0);
    

    接下来,我使用了一个半径为 9 像素的磁盘结构元素来扩大我的蒙版:

    se = strel('disk', 9); 
    maskIdx = imdilate(mask,se);
    

    编辑: 也可以使用任意的结构元素。我用过:se = strel(ones(9,9))

    然后,使用新蒙版,我将原始图像与新的扩张蒙版相乘:

    newImg(:,:,1) = rgb(:,:,1) .* uint8(maskIdx);    # image was of double data-type
    newImg(:,:,2) = rgb(:,:,2) .* uint8(maskIdx);
    newImg(:,:,3) = rgb(:,:,3) .* uint8(maskIdx);
    

    最后,我从原始图像中减去计算得到的颜色蒙版,得到我想要的去除边框的图像:

    finalImg = rgb - newImg;
    

    结果:

    image http://snag.gy/g2X1v.jpg

    【讨论】:

    • 准确度是多少?这删除了多少像素?它是只去除了白色边界,还是同时去除了一些视网膜?
    • @kkuilla 我认为它移除了边界以及视网膜的某些部分。我尝试尝试不同的磁盘大小,9 给了我最好的结果,去掉了大部分边框。在我的应用程序中,我并不关心边界处的像素,因为它们无论如何都不会影响整个图像。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多