How to extract tumour from bounding box and calculate its area?
1 view (last 30 days)
Show older comments
mounika siripurapu
on 9 Feb 2016
Commented: mounika siripurapu
on 10 Feb 2016
My project is to segment brain tumour using bounding box method. As a part of post-processing steps, I want to extract tumour inside the bounding box and calculate its area. I don't know how to proceed further. Coding up to forming bounding box and the input image is attached. Please help me with coding to extract tumour inside the box and calculate its area.
function initial I = double(imread('image1.bmp'));
I(:) = (I - min(I(:)))*255/(max(I(:)) - min(I(:)));
[M,I]=skull_detect(I); figure, imagesc(M), colormap(gray), axis image; drawnow;
h = size(I,1); STATS = regionprops(M,'all'); midx = round(STATS.Centroid(1)); M = logical(M);
subplot(2,2,1); imagesc(I),colormap(gray),axis image, title('MR Image'); drawnow; figure(1), subplot(2,2,2); imagesc(I), colormap(gray), axis image; drawnow; hold on, plot([midx midx],[1 h], 'linewidth', 2); drawnow; [b_x,b_y] = find(bwperim(M)== 1); hold on, plot(b_y,b_x, '.c'); drawnow;
Im = I(:,midx:-1:1); ImMask = M(:,midx:-1:1); RefI = I(:,midx:end); RefIMask = M(:,midx:end);
starti=round(STATS.BoundingBox(2)); endi=round(STATS.BoundingBox(2) + STATS.BoundingBox(4));
fact = 16; BC_diff_TD = score(Im,RefI,ImMask,RefIMask,starti,endi,fact);
figure(1), subplot(2,2,3),plot(starti:endi,BC_diff_TD); title('Score plot for vertical direction'); set(gcf, 'color', [1 1 1]);
vert_scale = 30; [topy1, downy1]= find_largest_decreasing_segment(BC_diff_TD,vert_scale);
topy = topy1(1); downy = downy1(1);
subplot(2,2,3), hold on; plot(topy+ starti-1,BC_diff_TD(topy), 'r.',downy+ starti-1,BC_diff_TD(downy),'m.','MarkerSize',10);
topy = topy + starti-1; downy = downy + starti-1; figure(1), hold on,
Im = (Im(topy:downy,:))'; ImMask = (ImMask(topy:downy,:))'; RefI = (RefI(topy:downy,:))'; RefIMask = (RefIMask(topy:downy,:))';
startj=1; endj=floor(min(STATS.BoundingBox(1) + STATS.BoundingBox(3)-midx+1, midx - STATS.BoundingBox(1)+1));
BC_diff_LR = score(Im,RefI,ImMask,RefIMask,startj,endj,fact); horz_scale = 30; [leftx1, rightx1]= find_largest_decreasing_segment(BC_diff_LR,horz_scale);
leftx = leftx1(1); rightx = rightx1(1); leftx2 = leftx1(1); rightx2 = rightx1(1); leftx = leftx + midx + startj-1; rightx = rightx + midx+ startj-1; m_right = mean2(I(topy:downy,leftx:rightx)); m_left = mean2(I(topy:downy,2* midx - rightx:2* midx - leftx)); isleft = 0; if m_left>m_right, leftx1 = 2* midx - rightx; rightx1 = 2* midx - leftx; leftx = leftx1; rightx = rightx1; isleft = 1; end if isleft == 1, figure(1), subplot(2,2,4),plot(midx - endj:midx - startj,-BC_diff_LR(end:-1:1),'r'); subplot(2,2,4), hold on; plot(rightx,-BC_diff_LR(leftx2),'y.',leftx,-BC_diff_LR(rightx2),'c.'); else figure(1), subplot(2,2,4),plot(midx+startj:midx+endj,BC_diff_LR,'r'); subplot(2,2,4), hold on; plot(leftx,BC_diff_LR(leftx2),'c.',rightx,BC_diff_LR(rightx2),'y.'); end title('Score plot for horizontal direction'); set(gcf, 'color', [1 1 1]);
figure(1),subplot(2,2,1), hold on; plot([leftx rightx],[topy, topy],'r'); plot([leftx rightx],[downy, downy],'g'); plot([leftx, leftx],[topy downy],'c'); plot([rightx, rightx],[topy downy],'y');
function [M,I]=skull_detect(I)
I(1:end,1)=0; I(1:end,end)=0; I(1,1:end)=0; I(end,1:end)=0; J = imfill(I,'holes');
K = im2bw(J/max(J(:)), 0.3* graythresh(J/max(J(:))));
[L,N] = bwlabel(K); maxa = 0; maxi=0; for i=1:N, a = sum(sum(L==i)); if a>maxa, maxa=a; maxi=i; end end L = double((L==maxi)); figure,imagesc(L),colormap(gray);axis image; drawnow;
STATS = regionprops(L,'all'); STATS.Centroid; x0 = round(STATS.Centroid(1)); y0 = round(STATS.Centroid(2));
[h,w] = size(I); temp = I(y0-min(y0,h-y0)+1:y0+min(y0,h-y0),x0-min(x0,w-x0)+1:x0+min(x0,w-x0)); clear I; I = temp; clear temp; temp = L(y0-min(y0,h-y0)+1:y0+min(y0,h-y0),x0-min(x0,w-x0)+1:x0+min(x0,w-x0)); L = temp; clear temp;
STATS.Orientation; if STATS.Orientation<0, M = imrotate(L,-90-STATS.Orientation); I = imrotate(I,-90-STATS.Orientation); else M = imrotate(L,90-STATS.Orientation); I = imrotate(I,90-STATS.Orientation); end close all;
function BC_diff_TD = score(Im,RefI,ImMask,RefIMask,starti,endi,fact)
BC_diff_TD = zeros(endi-starti+1,1);
minval = max(min(Im(:)),min(RefI(:))); maxval = min(max(Im(:)),max(RefI(:))); offset=15; xbins = (minval:fact:maxval); for i = starti:endi,
Tmp = Im(1:i,:);
H_leftTop = hist(Tmp(ImMask(1:i,:)),xbins);
clear Tmp;
Tmp = RefI(1:i,:);
H_rightTop = hist(Tmp(RefIMask(1:i,:)),xbins);
clear Tmp;
Tmp = Im(i:end,:);
H_leftBottom = hist(Tmp(ImMask(i:end,:)),xbins);
clear Tmp;
Tmp = RefI(i:end,:);
H_rightBottom = hist(Tmp(RefIMask(i:end,:)),xbins);
clear Tmp;
H_leftTop = H_leftTop / (sum(H_leftTop)+eps);
H_rightTop = H_rightTop / (sum(H_rightTop)+eps);
H_leftBottom = H_leftBottom / (sum(H_leftBottom)+eps);
H_rightBottom = H_rightBottom / (sum(H_rightBottom)+eps);
BC_Top = sum(sqrt(H_leftTop .* H_rightTop));
BC_Bottom = sum(sqrt(H_leftBottom .* H_rightBottom));
% compute difference of BCs
if i<=starti+offset,
BC_diff_TD(i-starti+1) = -BC_Bottom;
if i==starti+offset,
BC_diff_TD(1:i-starti+1) = BC_diff_TD(1:i-starti+1) + BC_Top;
end
elseif i>=endi-offset,
if i==endi-offset,
to_subs = BC_Bottom;
end
BC_diff_TD(i-starti+1) = BC_Top-to_subs;
else
BC_diff_TD(i-starti+1) = BC_Top-BC_Bottom;
end
end
function [from, to]= find_largest_decreasing_segment(score,scale)
hf_scale=round(scale/2);
ext_score = [ones(hf_scale,1)*score(1); score(:); ones(hf_scale,1)*score(end)]; N = length(score); reg_minmax = zeros(N,1);
for n=1:N, if min(ext_score(n:n+2*hf_scale))==score(n), reg_minmax(n)=-1; elseif max(ext_score(n:n+2*hf_scale))==score(n), reg_minmax(n)=1; end end
n=1; count = 0; while n <N-1; while reg_minmax(n)<1 && n<N-1, n = n + 1; end m=n; n = n+1; while reg_minmax(n)==0 && n<N, n=n+1; end if reg_minmax(n)==-1 count = count + 1; thisarea(count) = 0.5*(score(m)-score(n))*(n-m); from(count)=m; to(count)=n; end end [thisarea,ind] = sort(thisarea,'descend'); from(:) = from(ind); to(:) = to(ind);
2 Comments
John BG
on 10 Feb 2016
1.- do you really want to work with bitmaps, or you don't really mind using RGB .jpg images?
2.- Is is possible to use a reference 'slice' to compare and tell what tissue is damaged from the one that is not?
Accepted Answer
Image Analyst
on 10 Feb 2016
To find proven algorithms for segmenting tumors from MRI images, see the literature: http://www.visionbib.com/bibliography/contentsmedical.html#Medical%20Applications,%20CAT,%20MRI,%20Ultrasound,%20Heart%20Models,%20Brain%20Models
I don't know what "with the bounding box" means in your comment above, but if you want only the bounding box you need to call imcrop() first. If you want the bounding box in the overlay over the image, you have to call plot() to put it there, then call export_fig() to save the image with box in the overlay as an RGB image.
3 Comments
More Answers (0)
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!