Extracting Cracks
조회 수: 7 (최근 30일)
이전 댓글 표시
Hi,
I am working on an image which has pores and cracks. I was able to extract the pores excluding the cracks. Now I have to extract only the cracks. Is there any way to do this, that is to extract only cracks.
Below are the two images - 1st is the original image and second is the image which has only pores.
![](https://www.mathworks.com/matlabcentral/images/broken_image.png)
![](https://www.mathworks.com/matlabcentral/images/broken_image.png)
Below is the link for the image which has cracks rounded with brown color.
![](https://www.mathworks.com/matlabcentral/images/broken_image.png)
댓글 수: 6
Ashish Uthama
2011년 11월 7일
I can barely even see them at this resolution. What are these images? Can you improve the contrast/acquisition quality?
채택된 답변
Sven
2011년 11월 7일
Hi Ratna, It's quite difficult due to the relative intensities - cracks are only a "little" bit lighter than solid material. Here's my solution, which utilises Dirk Kroon's Frangi Vessel Filter on the FEX.
Sorry, I'm in a rush so I don't have time to comment it, but it's relatively short - hopefully you can follow line-by-line.
I've needed to put some pretty specific thresholds. I have no idea how it will work with "similar but different" images.
I = imread('Original_crackes.jpg');
Im = rgb2gray(I(130:700,450:1000,:)); % Clear away the border
Im_limited = double(min(max(200,Im),255));
Im_closed = imclose(Im_limited, ones(8));
Im_diff = Im_closed - Im_limited;
BW_holes = imopen(Im_limited<205,ones(4));
BW_pores = imclearborder(BW_holes);
Im_diff(imdilate(BW_holes,ones(10))) = 0;
% Get vessels
[Im_edgeEnhanced,Scale,Direction] = FrangiFilter2D(Im_diff/max(Im_diff(:)),struct('BlackWhite',false));
BW_cracks = bwareaopen(Scale==2, 50) & ~imdilate(BW_holes,ones(10));
CC = bwconncomp(BW_cracks);
stats = regionprops(CC, Im_edgeEnhanced,'Eccentricity','MaxIntensity','Orientation')
keepMask = [stats.Eccentricity]>0.983;
BW_cracks(cat(1,CC.PixelIdxList{~keepMask})) = false;
% Display
figure
subplot(1,3,1), imagesc(Im_limited), axis image
subplot(1,3,2), imagesc(BW_pores), axis image
subplot(1,3,3), imagesc(BW_cracks), axis image
댓글 수: 3
Walter Roberson
2011년 11월 8일
The rgb2gray() is not what is clearing the boarder: it is the array indexing. If your image is already in grayscale and already does not have the boarder, then change the series of lines to something like
[I, cmap] = imread('Original_crackes.IMA');
Im = rgb2gray(ind2rgb(I, cmap));
I am guessing here that IMA images are pseudo-color images.
Sven
2011년 11월 9일
Yes, the initial setup (loading the image, converting to grayscale, etc) is tailored to the sample .jpg file that you uploaded.
Since your true image is from from a different source, you will need to adjust those first lines as Walter points out.
Keep in mind that some of the constants that I've used: - Image limits of 200 -> 255 - "Hole" threshold of 205 - Various sizes for opening/closing/dilating (specified using "ones(x)") These were also tailored specifically to the image I had at hand. If your true image is different (ie, it actually uses CT Houndsfield units for intensity rather than the 1-255 that a .jpg conversion gives), then you may need to adjust those constants.
If in your original image the large circle is covered by approximately 512-by-512 pixels (which is the size of most full CT images), then this matches quite well with the image size that I wrote the answer for, and the dilation sizes I used should remain about right. You're still welcome to tinker with them to see if it improves the output.
추가 답변 (1개)
Image Analyst
2011년 11월 9일
Another option worth trying is anisotropic diffusion http://www.csse.uwa.edu.au/~pk/Research/MatlabFns/#anisodiff or coherence enhancing anisotropic diffusion filters, like is often used for fingerprints: http://www.vavlab.ee.boun.edu.tr/courses/574/materialx/PDEs%20in%20ImageProcessing/weickert_coherenceenhancing.pdf
Good luck.
댓글 수: 0
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!