检测和隔离图像的一部分

信息处理 图像处理 matlab
2022-02-15 21:50:30

我正在使用 matlab 的图像处理工具箱对腿部进行横截面 CT 扫描。我正在尝试做的部分工作是自动隔离任何图像中的腿,这需要移除图像中存在的任何无关物体。到目前为止,我的代码能够取出大多数对象,这适用于我的大多数图像。但是,一些图像有一个与腿齐平的对象,我的代码无法将其删除。

这是问题的一个示例:第一张图像显示原始图像,第二张图像显示“过滤”图像,在它去除了无关对象之后。但正如你所看到的,我想摆脱腿部横截面之外的东西。

原始 CT 图像

“过滤”CT图像

我曾想过使用一些东西来检测椭圆,但不幸的是,我的一些图像不是很好的同质形状(如下图所示)。

不同的形状

这是我拥有的当前代码:

% Read input file
inputfile = dlmread(filename,';');

% Normalise input file (0 to 1) & show original image
I_original = mat2gray(inputfile,[min(inputfile(:)) max(inputfile(:))]);
figure; imshow(I_original)

% Detect leg
BW1 = im2bw(I_original,.2);
BW2 = imfill(BW1,'holes');

% Remove misc. objects around leg (i.e., stray objects <5000 pixels)
BW_final = bwareaopen(BW2,5000);

% Generate filtered image
I_filtered = I_original;
I_filtered(imcomplement(BW_final)) = NaN;
figure; imshow(I_filtered)

任何有关如何解决此问题的建议将不胜感激!谢谢!

2个回答

由于 Extraneous 部分通过类似小线的东西与腿部连接,请尝试将其转换为二进制图像,然后侵蚀图像以去除较小的对象。那应该断开你的两个对象。然后选择面积最大的物体。

有用的功能——im2bw、imerode、rogionprops。

看看最短路径的威力。

准备图像

我为此使用问题中的图像,因此有一些额外的步骤

I = imread('leg.jpg');
I = rgb2gray(I);
I = double(I);
I = I(56:682,411:1027);

在此处输入图像描述

带通滤波器

我们有兴趣找到椭圆形部分的边缘。第一步是制作带通滤波器,在这种情况下是高斯差,以隔离较小的特征。

H1 = fspecial('gaussian',[60,60],5);
H2 = fspecial('gaussian',[60,60],2);
H = H2-H1;

在此处输入图像描述

边缘滤波器 使用希尔伯特变换制作两个边缘滤波器,一个在 x 方向,一个在 y 方向。

Hedge = imag(hilbert(H));

在此处输入图像描述 在此处输入图像描述

过滤后的图像

使用边缘过滤器过滤图像。将每个边缘滤波器响应平方,将它们加在一起,然后取平方根。结果是边缘的大小。

Iodd = sqrt(imfilter(I,Hedge).^2 + imfilter(I,Hedge.').^2);

在此处输入图像描述

最短路径

最短相位寻找最低能量(但不是负数)的路径,因此反转边缘值。我们在这里使用边缘值的对,因为这使得强边缘和弱边缘在值上更接近一点

G = log(Iodd);
G = max(G(:)) - G;

在此处输入图像描述

执行最短路径。我不会完全解释这一点,因为它需要整篇论文。

[ path, energy, lastIndex, pathImage ] = ...
    circularShortestPath(G, 0.1, [300,300], [100,400], [400,720]);

imagesc(G);
hold on;
plot(path(:,1),path(:,2),'r','LineWidth',2);
hold off;
pause;

imagesc(G);
hold on;
fill(path(:,1),path(:,2),'r');
hold off;
pause;

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

分割

使用路径分割图像

J = zeros(size(I));
mask = roipoly(J,path(:,1),path(:,2));
segmentedI = I .* mask;
imagesc(segmentedI); title('segmented image'); colormap gray(256); 

在此处输入图像描述

更多的

更改最短路径的中心点,您也可以分割其他内容:

[ path, energy, lastIndex, pathImage ] = ...
    circularShortestPath(G, 0.1, [114,394], [10,400], [400,720]);

在此处输入图像描述 在此处输入图像描述

我被忽视的网站上提供的代码:

http://imageprocessing.com.au/research/code/polarTransform.m http://imageprocessing.com.au/research/code/circularShortestPath.m http://imageprocessing.com.au/research/code/linearShortestPath。米