Skin lession boundary tracing algorithm
I found on matlab very handy tool which allows easily to trace boundaries of objects in a picture. So I adopted it to skin lesions. This can be used for automatic detection of skin irregularities and used to calculate lesion properties like asymmetry of shape, or border irregularities, who can help in detecting melanoma. There are numerous of investigations done, so I only put few examples on how it looks like. I will give you my source code, so you can try it by your own.
Look at my results:
1)
And it also finds center of mass;
2)
and center of mass:
3)
Here is my source code:
%———————————-
clear all
close all
clc
%k parameter can be changed to adjust intensity of image
ei=25;
st=35;
%k=10
k=ei*st;
I = imread(’1.jpg’);
%h=filter matrx
h = ones(ei,st) / k;
I1 = imfilter(I,h,’symmetric’);
figure
subplot(2,2,1),imshow(I), title(’Original image’);
subplot(2,2,2), imshow(I1), title(’Filtered Image’);
IG=rgb2gray(I1);
%Converting to BW
I11 = imadjust(IG,stretchlim(IG),[]);
level = graythresh(I11);
BWJ = im2bw(I11,level);
dim = size(BWJ)
IN=ones(dim(1),dim(2));
BW=xor(BWJ,IN); %inverting
subplot(2,2,3), imshow(BW), title(’Black and White’);
%Finding of initial point
row = round(dim(1)/2);
col = min(find(BW(row,:)))
%Tracing
boundary = bwtraceboundary(BW,[row, col],’W');
subplot(2,2,4),imshow(I), title(’Traced’);
hold on;
%Display traced boundary
plot(boundary(:,2),boundary(:,1),’g',’LineWidth’,2);
hold off
% figure
% plot(boundary(:,2),boundary(:,1),’black’,'LineWidth’,2);
nn=size(boundary);
KM=zeros(dim(1),dim(2));
ii=0;
%Create new matrix with boundary points. there fore we can get rid off
%other distortions outside boundaries
while ii<nn(1)
ii=ii+1;
KM(boundary(ii,1),boundary(ii,2))=1;
end
figure
subplot(2,2,1),plot(boundary(:,2),boundary(:,1),’black’,'LineWidth’,2);
subplot(2,2,2),imshow(KM)
%Fill inner boundaries where lesion is located
KM2 = imfill(KM,’holes’);
subplot(2,2,3),imshow(KM2)
KM1=xor(KM2,IN);
% subplot(2,2,4),imshow(KM1)
%Geometrical center
IVx=[1:dim(2)];
IVy=[1:dim(1)];
IMx=ones(dim(1),1)*IVx;
IMy=ones(dim(2),1)*IVy;
IMy = imrotate(IMy,-90);
Koordx=IMx.*KM2;
Koordy=IMy.*KM2;
xmean=mean(Koordx,2);
yc=round(sum(xmean.*IMy(:,1))/sum(xmean));
ymean=mean(Koordy);
xc=round(sum(ymean.*IVx)/sum(ymean));
figure
imshow(I)
hold on
plot(boundary(:,2),boundary(:,1),’green’,'LineWidth’,2);
hold on
plot(xc,1:dim(1),’red’,'LineWidth’,2);
plot(1:dim(2),yc,’red’,'LineWidth’,2);
hold off
% ID=im2double(I);
ID1(:,:,1)=im2double(I(:,:,1));
ID1(:,:,2)=im2double(I(:,:,2));
ID1(:,:,3)=im2double(I(:,:,3));
figure
subplot(2,2,1), imshow(ID1);
subplot(2,2,2), imshow(ID1(:,:,1));
hold on
plot(xc,1:dim(1),’red’,'LineWidth’,2);
plot(1:dim(2),yc,’red’,'LineWidth’,2);
hold off
subplot(2,2,3), imshow(ID1(:,:,2));
subplot(2,2,4), imshow(ID1(:,:,3));
%———————————

