67% found this document useful (3 votes)
2K views4 pages

Bone Fracture MATLAB Code

This document describes image processing steps to detect breaks in bones from x-ray images: 1. The image is denoised using Gaussian filtering and Canny edge detection is applied to find bone edges. 2. A Hough transform is performed on the edge image to detect the dominant line orientations, indicating bone pieces. 3. The edge image is convolved with lines of the detected orientations to locate where the intensity crosses zero, identifying break points. 4. An ellipse is fitted around the largest break point region to indicate its location.

Uploaded by

Rakesh Potla
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
67% found this document useful (3 votes)
2K views4 pages

Bone Fracture MATLAB Code

This document describes image processing steps to detect breaks in bones from x-ray images: 1. The image is denoised using Gaussian filtering and Canny edge detection is applied to find bone edges. 2. A Hough transform is performed on the edge image to detect the dominant line orientations, indicating bone pieces. 3. The edge image is convolved with lines of the detected orientations to locate where the intensity crosses zero, identifying break points. 4. An ellipse is fitted around the largest break point region to indicate its location.

Uploaded by

Rakesh Potla
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 4

img = imread('http://i.stack.imgur.com/mHo7s.

jpg');

ImgBlurSigma = 2; % Amount to denoise input image

MinHoughPeakDistance = 5; % Distance between peaks in Hough transform angle detection

HoughConvolutionLength = 40; % Length of line to use to detect bone regions

HoughConvolutionDilate = 2; % Amount to dilate kernel for bone detection

BreakLineTolerance = 0.25; % Tolerance for bone end detection

breakPointDilate = 6; % Amount to dilate detected bone end points

%%%%%%%%%%%%%%%%%%%%%%%

img = (rgb2gray(img)); % Load image

img = imfilter(img, fspecial('gaussian', 10, ImgBlurSigma), 'symmetric'); % Denoise

% Do edge detection to find bone edges in image

% Filter out all but the two longest lines

% This feature may need to be changed if break is not in middle of bone

boneEdges = edge(img, 'canny');

boneEdges = bwmorph(boneEdges, 'close');

edgeRegs = regionprops(boneEdges, 'Area', 'PixelIdxList');

AreaList = sort(vertcat(edgeRegs.Area), 'descend');

edgeRegs(~ismember(vertcat(edgeRegs.Area), AreaList(1:2))) = [];

edgeImg = zeros(size(img, 1), size(img,2));

edgeImg(vertcat(edgeRegs.PixelIdxList)) = 1;
% Do hough transform on edge image to find angles at which bone pieces are

% found

% Use max value of Hough transform vs angle to find angles at which lines

% are oriented. If there is more than one major angle contribution there

% will be two peaks detected but only one peak if there is only one major

% angle contribution (ie peaks here = number of located bones = Number of

% breaks + 1)

[H,T,R] = hough(edgeImg,'RhoResolution',1,'Theta',-90:2:89.5);

maxHough = max(H, [], 1);

HoughThresh = (max(maxHough) - min(maxHough))/2 + min(maxHough);

[~, HoughPeaks] = findpeaks(maxHough,'MINPEAKHEIGHT',HoughThresh, 'MinPeakDistance',


MinHoughPeakDistance);

% Plot Hough detection results

figure(1)

plot(T, maxHough);

hold on

plot([min(T) max(T)], [HoughThresh, HoughThresh], 'r');

plot(T(HoughPeaks), maxHough(HoughPeaks), 'rx', 'MarkerSize', 12, 'LineWidth', 2);

hold of

xlabel('Theta Value'); ylabel('Max Hough Transform');

legend({'Max Hough Transform', 'Hough Peak Threshold', 'Detected Peak'});

% Locate site of break

if numel(HoughPeaks) > 1;

BreakStack = zeros(size(img, 1), size(img, 2), numel(HoughPeaks));


% Convolute edge image with line of detected angle from hough transform

for m = 1:numel(HoughPeaks);

boneKernel = strel('line', HoughConvolutionLength, T(HoughPeaks(m)));

kern = double(bwmorph(boneKernel.getnhood(), 'dilate', HoughConvolutionDilate));

BreakStack(:,:,m) = imfilter(edgeImg, kern).*edgeImg;

end

% Take diference between convolution images. Where this crosses zero

% (within tolerance) should be where the break is. Have to filter out

% regions elsewhere where the bone simply ends.

brImg = abs(dif(BreakStack, 1, 3)) < BreakLineTolerance*max(BreakStack(:)) & edgeImg > 0;

[BpY, BpX] = find(abs(dif(BreakStack, 1, 3)) < BreakLineTolerance*max(BreakStack(:)) & edgeImg > 0);

brImg = bwmorph(brImg, 'dilate', breakPointDilate);

brReg = regionprops(brImg, 'Area', 'MajorAxisLength', 'MinorAxisLength', ...

'Orientation', 'Centroid');

brReg(vertcat(brReg.Area) ~= max(vertcat(brReg.Area))) = [];

% Calculate bounding ellipse

brReg.EllipseCoords = zeros(100, 2);

t = linspace(0, 2*pi, 100);

brReg.EllipseCoords(:,1) = brReg.Centroid(1) + brReg.MajorAxisLength/2*cos(t - brReg.Orientation);

brReg.EllipseCoords(:,2) = brReg.Centroid(2) + brReg.MinorAxisLength/2*sin(t - brReg.Orientation);

else
brReg = [];

end

% Draw ellipse around break location

figure(2)

imshow(img)

hold on

colormap('gray')

if ~isempty(brReg)

plot(brReg.EllipseCoords(:,1), brReg.EllipseCoords(:,2), 'r');

end

hold of

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy