使用 Matlab 进行肝脏分割的自适应阈值

信息处理 matlab 图像处理 计算机视觉
2022-01-16 10:32:37

我需要使用自适应阈值从腹部 CT 图像中分割肝脏。但是我将整个前景与背景分开。我只需要将前景的肝脏部分分开。查看http://www.ijcaonline.org/casct/number1/SPE34T.pdf中的 pdf 文件 我需要类似于图 6 所示的输出。

我在这里附上我的编码。请帮帮我。

%testadaptivethresh.m
clear;close all;
im1=imread('nfliver2.jpg');
bwim1=adaptivethreshold(im1,11,0.03,0);
figure,imshow(im1);
figure,imshow(bwim1);
imwrite(bwim1,'at2.jpg');

function bw=adaptivethreshold(IM,ws,C,tm)
%ADAPTIVETHRESHOLD An adaptive thresholding algorithm that seperates the
%foreground from the background with nonuniform illumination.
%  bw=adaptivethreshold(IM,ws,C) outputs a binary image bw with the local 
%   threshold mean-C or median-C to the image IM.
%  ws is the local window size.
%  tm is 0 or 1, a switch between mean and median. tm=0 mean(default); tm=1 median.
%
%  Contributed by Guanglei Xiong (xgl99@mails.tsinghua.edu.cn)
%  at Tsinghua University, Beijing, China.
%
%  For more information, please see
%  http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm

if (nargin<3)
    error('You must provide the image IM, the window size ws, and C.');
elseif (nargin==3)
    tm=0;
elseif (tm~=0 && tm~=1)
    error('tm must be 0 or 1.');
end

IM=mat2gray(IM);

if tm==0
    mIM=imfilter(IM,fspecial('average',ws),'replicate');
else
    mIM=medfilt2(IM,[ws ws]);
end
sIM=mIM-IM-C;
bw=im2bw(sIM,0);
bw=imcomplement(bw);

原始图像 分割后

我修改后的 testadaptivethresh.m 代码

clear;
im=imread('nfliver7.gif');
figure,imshow(im)
bwim1=adaptivethreshold(im,300,-0.15,0);
bw=bwareaopen(bwim1,3000);
se=strel('diamond',4);
er=imerode(bw,se);
bw1=bwareaopen(er,3000);
er1=imerode(bw1,se);
bw2=bwareaopen(er1,1000);
fi=imfill(bw2,'holes');
figure,imshow(fi)

op=uint8(fi);
seg=im.*op;
figure,imshow(seg)
imwrite(seg,'sliver7.jpg');
1个回答

我看到了你提到的论文的链接(SS Kumar)和你获得代码的链接(HIPR)是两种不同的算法——尽管两者听起来都像自适应阈值

首先我想告诉你区别。

在 HIPR 方法中,一般假设本质上是 2 类级别的图像——即前景和背景。在任何 2 类阈值中,人们期望图像直方图中有 2 个峰值或区域,特别是背景与前景、文本与白皮书。如果您以某种方式在直方图中找到了最佳谷点 - 您将获得最干净的划分。这是直方图的样子:
在此处输入图像描述

然而,这个谷点可能会在当地略微移动。那里给出了照明变化的很好的例子。因此,这个最佳谷点无处不在,但在空间上略有变化,因此通用阈值将失败。因此,在每个局部区域上计算谷点(阈值)。

SS Kumar 的论文方法,更具体地说是您正在处理的图像类别,是多类别的(多个对象,每个对象具有不同的强度带和分布)。在这种情况下,直方图是多模态的,即它有许多峰和谷,并且可能每个峰对应于不同的对象,但它可能更复杂。

直方图可能看起来像这样:(这与纸上的图像相同)。 在此处输入图像描述

在这种情况下,上述 2 类方法将完全失败,因为没有一个好的山谷。这就是为什么您发布的第一张图片看起来像周围的黑/白点。

此处自适应阈值的含义意味着您需要识别正确的峰值,并且覆盖杠杆和其他物体的大部分强度的灰度带形成鲜明对比,这使得

你该怎么办?

首先,如果必须使用自适应阈值,找到直方图并查看强度范围,然后对于左侧或右侧的阈值是应丢弃哪些像素的强度边界。

或者,您可以使用区域增长或拆分和合并算法。有关一些信息,请参阅此问题:哪些分割方法可用于简单图像?