使用matlab在图像边界上创建强度带

时间:2015-02-05 20:30:10

标签: matlab image-processing

我有这个图像(8位,伪彩色,灰度): original image

我想在它的边界周围创建一个特定尺度的强度带。

我尝试过侵蚀和其他数学运算,包括过滤以达到所需的波段但实际图像强度会在我使用侵蚀来切割部分边界时立即改变。

到目前为止我的代码看起来像:

clear all
clc
x=imread('8-BIT COPY OF EGFP001.tif');
imshow(x);
y = imerode(x,strel('disk',2));
y1=imerode(y,strel('disk',7));
z=y-y1;
figure
z(z<30)=0
imshow(z)

我遇到的主要问题是它在某种程度上改变了原始图像的强度,如下所示:

actual result

所以我的问题是,如何在不改变原始图像的任何其他属性的情况下在图像边界上创建这样的波段?

1 个答案:

答案 0 :(得分:5)

与烧杯谈论的内容以及您想要做的事情一样,我会亲自将您的图片转换为二进制文件,其中false代表背景,true代表前景。完成后,您会使用一个良好的结构元素来侵蚀此图像,该元素会保留对象轮廓的圆度(在您的示例中为disk)。

这个输出将是图像中大对象的内部。您可以做的是使用此蒙版并将图像中的这些位置设置为黑色,以便您可以保留外带。因此,尝试做这样的事情:

%// Read in image (directly from StackOverflow) and pseudo-colour the image
[im,map] = imread('http://i.stack.imgur.com/OxFwB.png');
out = ind2rgb(im, map);

%// Threshold the grayscale version
im_b = im > 10;

%// Create structuring element that removes border
se = strel('disk',7);

%// Erode thresholded image to get final mask
erode_b = imerode(im_b, se);

%// Duplicate mask in 3D
mask_3D = cat(3, erode_b, erode_b, erode_b);

%// Find indices that are true and black out result
final = out;
final(mask_3D) = 0;

figure;
imshow(final);

让我们慢慢浏览一下代码。前两行采用PNG图像,其中包含灰度图像和颜色图,我们将这两个图读入MATLAB。接下来,我们使用ind2rgb将图像转换为伪彩色版本。一旦我们这样做,我们使用灰度图像并对图像进行阈值处理,以便捕获所有对象像素。我使用值10对图像进行阈值处理,以避免图像中出现的某些量化噪声。这个二进制图像是我们将要操作以确定我们想要设置为0以获得外边界的像素。

接下来,我们声明一个半径为7的磁盘的结构元素,然后侵蚀掩码。完成后,我在3D中复制此蒙版,使其与伪彩色图像具有相同数量的通道,然后使用蒙版的位置将对象内部的值设置为0。结果将是原始图像,但保留所有对象的外部轮廓。

我得到的结果是:

enter image description here