Domanda

I have an image like shown here: Finger_vein My ultimate aim is to extract the vein pattern in the finger. So What I am trying to do is the extraction of the finger object alone. For that purpose, I tried an Otsu thresholding step first, then an erosion and dilation. Now using the binary image as a mask I multiplied element wise with original image to obtain the finger alone (not that accurate though). enter image description here

The code is as below:

I = imread('3.5.bmp');
[level] = graythresh(I);
BW = im2bw(I,level);
[BWm] = imerode(BW,strel('disk',10)); figure, imshow(BWm)
[BWmm] = imdilate(BWm,strel('disk',15)); figure, imshow(BWmm)
B = I.*uint8(BWmm); % BWmm is the mask
imshow(B)

Now I want to crop this finger part alone using the mask which I created before. How to achieve that?

For clarity I am uploading the image with the area to be cropped: enter image description here (And finally I don't want to do this manually or using imcrop() utility with pixel coordinates as input. I would like to get those pixel coordinate using some algorithms.)

È stato utile?

Soluzione

You can find the pixel coordinates from the mask BWmm and then use the coordinates with imcrop.

To find the extermal points of BWmm use

projX = any( BWmm, 1 ); % projection of mask along x direction
projY = any( BWmm, 2 ); % projection of mask along y direction
fx = find( projX, 1, 'first' ); % first column with non-zero val in mask
tx = find( projX, 1, 'last' );  % last column with non-zero val in mask
fy = find( projY, 1, 'first' ); % first row with non-zero val in mask
ty = find( projY, 1, 'last' );  % last row with non-zero val in mask
cropRect = [fx, fy, tx-fx+1, ty-fy+1];
cImg = imcrop( I, cropRect );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top