使用 matlab 创建跨图像边界的强度带
Creating intensity band across image border using matlab
我有这张图片(8 位,伪彩色,灰度):
我想在它的边界周围创建一个特定度量的强度带。
我尝试了侵蚀和其他数学运算,包括过滤以获得所需的波段,但是当我使用侵蚀来切割部分边界时,实际图像强度会立即发生变化。
到目前为止,我的代码如下所示:
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)
我在使用它时遇到的主要问题是它在一定程度上改变了原始图像的强度,如下所示:
所以我的问题是,如何在不更改原始图像的任何其他属性的情况下跨图像边界创建这样的带?
根据烧杯所说的内容和您想要完成的操作,我会亲自将您的图像转换为二进制文件,其中 false
代表背景,true
代表前景。完成后,然后使用良好的结构元素侵蚀此图像,该结构元素保留对象轮廓的圆度(示例中的 disk
)。
它的输出将是图像中大物体的内部。你可以做的是使用这个蒙版,将图像中的这些位置设置为黑色,这样你就可以保留外带。因此,尝试做这样的事情:
%// Read in image (directly from Whosebug) 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。结果将是原始图像,但保留所有对象的外部轮廓。
我得到的结果是:
我有这张图片(8 位,伪彩色,灰度):
我想在它的边界周围创建一个特定度量的强度带。
我尝试了侵蚀和其他数学运算,包括过滤以获得所需的波段,但是当我使用侵蚀来切割部分边界时,实际图像强度会立即发生变化。
到目前为止,我的代码如下所示:
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)
我在使用它时遇到的主要问题是它在一定程度上改变了原始图像的强度,如下所示:
所以我的问题是,如何在不更改原始图像的任何其他属性的情况下跨图像边界创建这样的带?
根据烧杯所说的内容和您想要完成的操作,我会亲自将您的图像转换为二进制文件,其中 false
代表背景,true
代表前景。完成后,然后使用良好的结构元素侵蚀此图像,该结构元素保留对象轮廓的圆度(示例中的 disk
)。
它的输出将是图像中大物体的内部。你可以做的是使用这个蒙版,将图像中的这些位置设置为黑色,这样你就可以保留外带。因此,尝试做这样的事情:
%// Read in image (directly from Whosebug) 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。结果将是原始图像,但保留所有对象的外部轮廓。
我得到的结果是: