Reputation: 1003
I have a segmented liver. I need to segment the tumor in it. I used the FCM method. It is a 3 level FCM thresholding. When I apply it to the images, I need the tumor region(the region that is darker than the remaining parts) alone to get segmented. But am getting the reverse. All the region surrounding the tumor gets segmented. Kindly help me out. The program has two files, testfcmthresh.m
and a function fcmthresh.m
The input 'segmented liver(using region growing)' and the FCM output image:
I tried complementing the image obtained by using imcomplement()
But I got the entire background also as white, since the background was originally dark. Kindly help me out.
function [bw,level]=fcmthresh(IM,sw)
%FCMTHRESH Thresholding by 3-class fuzzy c-means clustering
% [bw,level]=fcmthresh(IM,sw) outputs the binary image bw and threshold level of
% image IM using a 3-class fuzzy c-means clustering. It often works better
% than Otsu's methold which outputs larger or smaller threshold on
% fluorescence images.
% sw is 0 or 1, a switch of cut-off position.
% sw=0, cut between the small and middle class
% sw=1, cut between the middle and large class
%
% Contributed by Guanglei Xiong ([email protected])
% at Tsinghua University, Beijing, China.
% check the parameters
if (nargin<1)
error('You must provide an image.');
elseif (nargin==1)
sw=0;
elseif (sw~=0 && sw~=1)
error('sw must be 0 or 1.');
end
data=reshape(IM,[],1);
[center,member]=fcm(data,3);
[center,cidx]=sort(center);
member=member';
member=member(:,cidx);
[maxmember,label]=max(member,[],2);
if sw==0
level=(max(data(label==1))+min(data(label==2)))/2;
else
level=(max(data(label==2))+min(data(label==3)))/2;
end
bw=im2bw(IM,level);
%testfcmthresh.m
clear;clc;
im=imread('mliver3.jpg');
fim=mat2gray(im);
level=graythresh(fim);
bwfim=im2bw(fim,0.1);
[bwfim0,level0]=fcmthresh(fim,0);
[bwfim1,level1]=fcmthresh(fim,1);
subplot(2,2,1);
imshow(fim);title('Original');
subplot(2,2,2);
imshow(bwfim);title(sprintf('Otsu,level=%f',level));
subplot(2,2,3);
imshow(bwfim0);title(sprintf('FCM0,level=%f',level0));
subplot(2,2,4);
imshow(bwfim1);title(sprintf('FCM1,level=%f',level1));
% imwrite(bwfim1,'fliver6.jpg');
Upvotes: 4
Views: 10148
Reputation: 1003
The answer for my question has been told by Ghaul in my previous question 'Extracting image region within boundary'. If any one needs to refer, kindly go through the comments by Ghaul in that.Thank you.
Upvotes: 1