user5184777
user5184777

Reputation:

error while masking an image

I just want to threshold it before applying algorithm.i tried it in one algorithm and got perfect result.but here i considered binary image and then masking.i just want the intervertebral disc(ellipse portion) which is in between vertebrae .can you suggest any other method?

 close all;
    clear all;
    %%
    Img = imread('Sub.png');
    Img=rgb2gray(Img);%convert to single channel as data do not contain color image
    Img=im2bw(Img,.16);
    fig1=figure;
    subplot(221)
    imshow(Img); title('Original Image')

    m1 = uint8(Img>35);
    subplot(222), imshow(m1,[]); title('Mask m1');

    m2=uint8(Img<300);
    subplot(223), imshow(m2,[]); title('Mask m2');

    sd = stdfilt( double(Img), ones(3,3));
    m3= uint8(sd<18);
    subplot(224), imshow(m3,[]); title('Mask m3');

    fig2=figure;
    I = uint8(Img.* m1);
    I = uint8(I.* m2);
    I = uint8(I.* m3);
    subplot(221), imshow(I);
    title('Masked Img')

i'm getting error as

I cannot view mask1 , mask 2, mask3 and also I'm getting error Error using .* Integers can only be combined with integers of the same class, or scalar doubles.

Error in test1 (line 22)

corrected code is

close all;
clear all;
%%
Img = imread('Sub.png');
Img=rgb2gray(Img);%convert to single channel as data do not contain color image
Img=im2bw(Img,.16);
fig1=figure;
subplot(221)
imshow(Img); title('Original Image')

m1 = uint8(Img>35);
subplot(222), imshow(m1,[]); title('Mask m1');

m2=uint8(Img<300);
subplot(223), imshow(m2,[]); title('Mask m2');

sd = stdfilt( double(Img), ones(3,3));
m3= uint8(sd<18);
subplot(224), imshow(m3,[]); title('Mask m3');

fig2=figure;
Img(~m1)=0;
Img(~m2)=0;
Img(~m3)=0;
subplot(221), imshow(Img);
title('Masked Img')

Upvotes: 1

Views: 173

Answers (1)

Daniel
Daniel

Reputation: 36710

There are probably multiple issues with the code. While applying a mask using multiplication is technically possible, I recommend to use indexing instead:

Img(~mask)=0;

This code sets every pixel which is not in mask to zero.

There is probably another issue with your code. You are using uint8 to get a uint8 image, but the function does not rescale. If you input a normalized double image (values between 0 and 1) you will end up with a black image because it contains only 0 and 1 values. Use im2uint8 to convert images, but I think what you are trying to do here could be done on the double image as well.

Upvotes: 1

Related Questions