You should be able to just threshold and call bwlabel.
[labeledImage, numRegions] = bwlabel(grayImage > 0, 4);
I'm not sure why your image is all broken up like that. It looks like you either did an edge detection or you did not have a good image to start with. If you had a JPG image, the lines are likely blurred and not perfectly 0. Never use JPG images for image analysis. How was this image created anyway? Was it stored in between in a JPG format (which blurs it) and then recalled?