Question

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.)

Was it helpful?

Solution

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 );
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top