How to extract tumour from bounding box and calculate its area?
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
mounika siripurapu
am 9 Feb. 2016
Kommentiert: mounika siripurapu
am 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 Kommentare
John BG
am 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?
Akzeptierte Antwort
Image Analyst
am 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 Kommentare
Weitere Antworten (0)
Siehe auch
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!