2014-06-09 62 views
1

我有一个视网膜底图像,沿着角落有一个白色边框。我试图去除图像所有四边的边框。这是一个预处理步骤和我的形象看起来是这样的:Matlab - 使用逻辑索引删除图像边界

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 

回答

2

解决它自己。这是我做了一些帮助。

我首先计算了所有三个颜色通道组合的遮罩。这是因为每个通道的遮罩单独应用于所有三个通道时不相同,并且如果仅使用原始图像中某个通道的遮罩,残留像素将留在最终图像中:

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

+0

准确度是多少?这个删除了多少像素?它是仅移除白色边界还是移除了一些视网膜? – kkuilla

+0

@ kkuilla我认为它可以消除视网膜边界的边界。我试着用不同的磁盘大小进行试验,9个删除了大部分边界,给了我最好的结果。在我的应用程序中,我不关心边界像素,因为它们无论如何都不会影响整个图像。 – Eagle