How to do skull stripping when the skull in the image is not complete?

How do I remove the skull (as well as others tissues that are not tumor, but have similar intensity) from the MRI images? I have seen methods including removing the largest blob (the skull), but the skull does not enclose the brain fully in the picture I attached here. Using imbinarize will also keep other tissues which have similar intensity as the tumor in the image.
I have tried to use imerode, but the skull is not removed entirely.
Any help is appreciated. Thanks!

3 Comments

Hi Eudora,
To address solution to your posted comments, you have to follow the following steps, load the MRI image into Matlab, convert the RGB image to grayscale for processing.Use Otsu's method (graythresh) to find an optimal threshold for binarization. Binarize the grayscale image using the threshold to create a binary mask of the tumor region.Eliminate small objects (noise) from the binary mask using bwareaopen.Invert the binary mask to retain the tumor region while excluding other tissues. You should be able to show the original MRI image alongside the extracted tumor region for visualization. Here is the snippet code to help you further,
% Read the MRI image
MRI = imread('MRI_image.jpg');
% Convert the image to grayscale
MRI_gray = rgb2gray(MRI);
% Threshold the image to create a binary mask of the tumor region
threshold = graythresh(MRI_gray);
binary_mask = imbinarize(MRI_gray, threshold);
% Remove small objects to exclude noise
binary_mask_cleaned = bwareaopen(binary_mask, 1000);
% Invert the binary mask to keep the tumor region
tumor_region = imcomplement(binary_mask_cleaned);
% Display the resulting image with only the tumor region
imshowpair(MRI, tumor_region, 'montage');
This code snippet should help you effectively remove non-tumor tissues, like the skull, from MRI images while preserving the tumor region for further analysis or processing. Please let me know if you have any further questions.
Hi, thanks for your reply. I tried to use similar methods / functions but it didn't work well.. but still, thank you for trying to help!
Hi Eudora,
Glad to help, but if these functions did not work, I will provide guidance on how to use these functions, in case if you have to utilize them in your future matlab projects, please refer to
https://www.mathworks.com/help/images/ref/bwareaopen.html
https://www.mathworks.com/help/images/ref/imcomplement.html?searchHighlight=imcomplement&s_tid=srchtitle_support_results_1_imcomplement
https://www.mathworks.com/help/images/ref/imshowpair.html?searchHighlight=imshowpair&s_tid=srchtitle_support_results_1_imshowpair
Good luck!

Sign in to comment.

 Accepted Answer

I presume you've already seen my skull stripping demo I've posted many times, but I'm attaching it here for others.
If your initial binary image, gotten from thresholding, has gaps in the skull, then imerode will erode it from both sides, as well as any blobs inside thus changing their area and shape. So what you want to do is to create a full skull mask using bwconvhull and then erode that and use it as a mask against your gray level image or another binary image.
The assumptions of the skull or tumor being the largest blob is not robust. Not only that but there is a possibility that there may be more than one tumor.
But what you do know is that the skull is, or should be the outermost blob since it encloses everything else. If there are no blobs outside the skull then you label the binary image mask and the skull will have a label ID of 1 and you can se ismember to get the skull blob alone, if you want it. However a more robust way that handles small outside blobs, like text annotations or whatever is to call bwconvhull and then call bwareafilt
% Fill gaps in outer skull blob.
headMask = bwconvhull(binary_mask, 'objects');
% Take largest blob which should be the whole head mask.
headMask = bwareafilt(headMask, 1);
% Erode it some amount to get a mask of just the interior.
se = strel('disk', 5, 0);
headMask = imerode(headMask, se); % Shrunken head mask
% Now use the headMask to mask out the skull and everything outside of it.
binary_mask = binary_mask & headMask;
% Now only blobs inside the skull remain and you can continue segmentation
% to find one or more tumors based on some criteria.
But I really think that if you want a robust algorithm you should not use any 30 line code snippet you get here but see how people have discovered how to do it and have published peer reviewed results. They've spent years perfecting the algorithm and it will be better than any simplistic algorithm I think up off the top of my head. You can search PubMed (medical papers) or VisionBib (archive of all image processing papers):

2 Comments

Woww, thank you for introducing new functions and recommending helpful papers! I will try to use those functions on my project once I get back to work! (I am on vacation.) Thank you for all the help, appreciate it!!
Attached is a more complete demo that produces the image below.

Sign in to comment.

More Answers (1)

Hi Eudora,
I understand that you wish to remove the skull area in order to isolate the tumour from the MRI scans but are facing issues with it.
To isolate and remove everything except the tumor (assuming the bright white spot) from the MRI image, it is required to focus on segmenting the brightest region. The following approach can be followed to achieve this:
  1. Enhance the contrast to highlight the tumor. "imadjust" function can be used to enhance the contrast of the grayscale image.
  2. Use thresholding to segment the brightest region.Use "imbinarize" with a high threshold value to isolate the bright regions.
  3. Apply morphological operations to refine the segmentation. "imerode" and "imdilate" refine the segmentation by removing small artifacts and filling gaps. "imfill" fills any holes within the segmented region.
  4. Select the tumour region. Use "bwlabel" to label connected components in the binary image and "regionprops" to measure the properties of each labeled region to identify the largest one, assumed to be the tumor.
  5. Mask the original image to isolate the tumor.
Please refer to the following code snippet for demo:
img = imread("image.jpeg");
grayImg = rgb2gray(img);
% Apply Gaussian filter to smooth the image
filteredImg = imgaussfilt(grayImg, 1);
% Enhance contrast
enhancedImg = imadjust(filteredImg);
% Thresholding to segment the bright region
thresholdValue = 0.93; % Adjust this value as needed
binaryImg = imbinarize(enhancedImg, thresholdValue);
% Morphological operations to refine the segmentation
binaryImg = imerode(binaryImg, strel('disk', 2));
binaryImg = imdilate(binaryImg, strel('disk', 3));
binaryImg = imfill(binaryImg, 'holes');
% Label connected components
labeledImg = bwlabel(binaryImg);
% Measure properties of the blobs
stats = regionprops(labeledImg, 'Area', 'PixelIdxList');
% Find the largest blob (assuming it's the tumor)
[~, idx] = max([stats.Area]);
tumorMask = ismember(labeledImg, idx);
% Apply the mask to the original image to isolate the tumor
tumorImg = grayImg;
tumorImg(~tumorMask) = 0;
% Display the results
figure;
subplot(1, 2, 1), imshow(grayImg), title('Original Image');
subplot(1, 2, 2), imshow(tumorImg), title('Isolated Tumor');
Please refer to the following documentation links to learn more about mentioned functions:
Hope this helps!

2 Comments

imadjust is not needed - it simply changes the threshold to a different gray level than it would be originally but won't change the binary image. I also doubt that blurring the image is necessary because it will just make the tumor boundary smoother and less accurate. And the code depends on the tumor being brighter than the skull but she said that in some images the tumor is not brighter because it's the same brightness as the skull.
Hi, thank you for your reply and the example code! I will try to use them once I get back to work!

Sign in to comment.

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!