I have 32 breast tissue images where 16 are benign and 16 are malignant. I have applied PCA for dimension reduction. I have applied SVM for classification. Problem arises when I try to find the label of a new input image. I am getting an error message. Please find my code and error message below.
clc;clear;close all
%% Getting Image
for k = 1 : 32
jpgFileName = strcat('B', num2str(k), '.jpg');
if isfile(jpgFileName)
i = imread(jpgFileName);
else
fprintf('File %s does not exist.\n', jpgFileName);
end
% if image is rgb
try
i=rgb2gray(i);
end
%% Crop The Breast
z=im2bw(i,0.1);
figure(2)
imshow(z);title('Original B&W')
info=regionprops(z);
a=cat(1,info.Area);
[m,l]=max(a);
X=info(l).Centroid;
bw2=bwselect(z,X(1),X(2),8);
i=immultiply(i,bw2);
figure(3)
imshow(i);
title('Getting the Breast and Muscle')
%% Deleting Black Ground
% We will delete the black corners
% So that we can select the muscle
% using bwselect
% convert to B&W first time
[x,y]=size(z);
tst1=zeros(x,y);
% detect empty rows
r1=[];
m=1;
for j=1:x
if z(j,:)==tst1(j,:)
r1(m)=j;
m=m+1;
end
end
% detect empty columns
r2=[];
m=1;
for j=1:y
if z(:,j)==tst1(:,j)
r2(m)=j;
m=m+1;
end
end
% Deleting
i(:,r2)=[];
i(r1,:)=[];
figure(4)
imshow(i);title('after deleting background');
%% Deleting the Muscle
if i(1,1)~=0
c=3;
r=3;
else
r=3;
c=size(i,2)-3;
end
z2=im2bw(i,0.5);
bw3=bwselect(z2,c,r,8);
bw3=~bw3;
ratio=min(sum(bw3)/sum(z2));
if ratio>=1
i=immultiply(i,bw3);
else
z2=im2bw(i,0.75);
bw3=bwselect(z2,c,r,8);
ratio2=min(sum(bw3)/sum(z2));
if round(ratio2)==0
lvl=graythresh(i);
z2=im2bw(i,1.75*lvl);
bw3=bwselect(z2,c,r,8);
bw3=~bw3;
i=immultiply(i,bw3);
else
bw3=~bw3;
i=immultiply(i,bw3);
end
end
figure(5)
imshow(i)
title('Getting only the Breast')
%% Adaptive Median Filter
% clc;
% clear;
% close all;
% a=imread('M1.jpg');
% b=rgb2gray(i);
J = imnoise(i,'salt & pepper', 0.02);
NoisyImage=J;
[R C P]=size(NoisyImage);
OutImage=zeros(R,C);
figure;
% imshow(J);
Zmin=[];
Zmax=[];
Zmed=[];
for i=1:R
for j=1:C
if (i==1 & j==1)
% for right top corner[8,7,6]
elseif (i==1 & j==C)
% for bottom left corner[2,3,4]
elseif (i==R & j==1)
% for bottom right corner[8,1,2]
elseif (i==R & j==C)
%for top edge[8,7,6,5,4]
elseif (i==1)
% for right edge[2,1,8,7,6]
elseif (i==R)
% // for bottom edge[8,1,2,3,4]
elseif (j==C)
%// for left edge[2,3,4,5,6]
elseif (j==1)
else
SR1 = NoisyImage((i-1),(j-1));
SR2 = NoisyImage((i-1),(j));
SR3 = NoisyImage((i-1),(j+1));
SR4 = NoisyImage((i),(j-1));
SR5 = NoisyImage(i,j);
SR6 = NoisyImage((i),(j+1));
SR7 = NoisyImage((i+1),(j-1));
SR8 = NoisyImage((i+1),(j));
SR9 = NoisyImage((i+1)),((j+1));
TempPixel=[SR1,SR2,SR3,SR4,SR5,SR6,SR7,SR8,SR9];
Zxy=NoisyImage(i,j);
Zmin=min(TempPixel);
Zmax=max(TempPixel);
Zmed=median(TempPixel);
A1 = Zmed - Zmin;
A2 = Zmed - Zmax;
if A1 > 0 && A2 < 0
% go to level B
B1 = Zxy - Zmin;
B2 = Zxy - Zmax;
if B1 > 0 && B2 < 0
OutImage(i,j)= Zxy;
else
OutImage(i,j)= Zmed;
end
else
if ((R > 4 && R < R-5) && (C > 4 && C < C-5))
S1 = NoisyImage((i-1),(j-1));
S2 = NoisyImage((i-2),(j-2));
S3 = NoisyImage((i-1),(j));
S4 = NoisyImage((i-2),(j));
S5 = NoisyImage((i-1),(j+1));
S6 = NoisyImage((i-2),(j+2));
S7 = NoisyImage((i),(j-1));
S8 = NoisyImage((i),(j-2));
S9 = NoisyImage(i,j);
S10 = NoisyImage((i),(j+1));
S11 = NoisyImage((i),(j+2));
S12 = NoisyImage((i+1),(j-1));
S13 = NoisyImage((i+2),(j-2));
S14 = NoisyImage((i+1),(j));
S15 = NoisyImage((i+2),(j));
S16 = NoisyImage((i+1)),((j+1));
S17 = NoisyImage((i+2)),((j+2));
TempPixel2=[S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17];
Zmed2=median(TempPixel2);
OutImage(i,j)= Zmed2;
else
OutImage(i,j)= Zmed;
end
end
end
end
end
imshow(OutImage,[]);
title('Adaptive Median Filter')
disp('exit');
%%GLCM Feature Extraction
% Y=rgb2gray(OutImage);
Y=double(OutImage);
% statsArray=[];
% Y=Y{k};
glcm2=graycomatrix(Y);
stats = GLCM_Features1(glcm2,0);
ExtractedFeaturesm16=stats;
% save('ExtractedFeaturesm16.mat')
statsTable = struct2table(stats);
% statsArray = table2array(statsTable);
statsArray(k,:) = table2array(statsTable);
% statsArray'
end
% coeff = pca(statsArray);
[coeff,score,latent,~,explained] = pca(statsArray);
covarianceMatrix = cov(statsArray);
[V,D] = eig(covarianceMatrix);
coeff
V
dataInPrincipalComponentSpace = statsArray*coeff
score2=score(:,1:2);
% coeff2 = coeff(:,1:2);
corrcoef(dataInPrincipalComponentSpace)
var(dataInPrincipalComponentSpace)'
latent
sort(diag(D),'descend')
inp=input('Enter Image:');
i=imread(inp);
try
i=rgb2gray(i);
end
z=im2bw(i,0.1);
figure(2)
imshow(z);title('Original B&W')
info=regionprops(z);
a=cat(1,info.Area);
[m,l]=max(a);
X=info(l).Centroid;
bw2=bwselect(z,X(1),X(2),8);
i=immultiply(i,bw2);
figure(3)
imshow(i);
title('Getting the Breast and Muscle')
%% Deleting Black Ground
% We will delete the black corners
% So that we can select the muscle
% using bwselect
% convert to B&W first time
[x,y]=size(z);
tst1=zeros(x,y);
% detect empty rows
r1=[];
m=1;
for j=1:x
if z(j,:)==tst1(j,:)
r1(m)=j;
m=m+1;
end
end
% detect empty columns
r2=[];
m=1;
for j=1:y
if z(:,j)==tst1(:,j)
r2(m)=j;
m=m+1;
end
end
% Deleting
i(:,r2)=[];
i(r1,:)=[];
figure(4)
imshow(i);title('after deleting background');
%% Deleting the Muscle
if i(1,1)~=0
c=3;
r=3;
else
r=3;
c=size(i,2)-3;
end
z2=im2bw(i,0.5);
bw3=bwselect(z2,c,r,8);
bw3=~bw3;
ratio=min(sum(bw3)/sum(z2));
if ratio>=1
i=immultiply(i,bw3);
else
z2=im2bw(i,0.75);
bw3=bwselect(z2,c,r,8);
ratio2=min(sum(bw3)/sum(z2));
if round(ratio2)==0
lvl=graythresh(i);
z2=im2bw(i,1.75*lvl);
bw3=bwselect(z2,c,r,8);
bw3=~bw3;
i=immultiply(i,bw3);
else
bw3=~bw3;
i=immultiply(i,bw3);
end
end
figure(5)
imshow(i)
title('Getting only the Breast')
J = imnoise(i,'salt & pepper', 0.02);
NoisyImage=J;
[R C P]=size(NoisyImage);
OutImage=zeros(R,C);
figure;
% imshow(J);
Zmin=[];
Zmax=[];
Zmed=[];
for i=1:R
for j=1:C
if (i==1 & j==1)
% for right top corner[8,7,6]
elseif (i==1 & j==C)
% for bottom left corner[2,3,4]
elseif (i==R & j==1)
% for bottom right corner[8,1,2]
elseif (i==R & j==C)
%for top edge[8,7,6,5,4]
elseif (i==1)
% for right edge[2,1,8,7,6]
elseif (i==R)
% // for bottom edge[8,1,2,3,4]
elseif (j==C)
%// for left edge[2,3,4,5,6]
elseif (j==1)
else
SR1 = NoisyImage((i-1),(j-1));
SR2 = NoisyImage((i-1),(j));
SR3 = NoisyImage((i-1),(j+1));
SR4 = NoisyImage((i),(j-1));
SR5 = NoisyImage(i,j);
SR6 = NoisyImage((i),(j+1));
SR7 = NoisyImage((i+1),(j-1));
SR8 = NoisyImage((i+1),(j));
SR9 = NoisyImage((i+1)),((j+1));
TempPixel=[SR1,SR2,SR3,SR4,SR5,SR6,SR7,SR8,SR9];
Zxy=NoisyImage(i,j);
Zmin=min(TempPixel);
Zmax=max(TempPixel);
Zmed=median(TempPixel);
A1 = Zmed - Zmin;
A2 = Zmed - Zmax;
if A1 > 0 && A2 < 0
% go to level B
B1 = Zxy - Zmin;
B2 = Zxy - Zmax;
if B1 > 0 && B2 < 0
OutImage(i,j)= Zxy;
else
OutImage(i,j)= Zmed;
end
else
if ((R > 4 && R < R-5) && (C > 4 && C < C-5))
S1 = NoisyImage((i-1),(j-1));
S2 = NoisyImage((i-2),(j-2));
S3 = NoisyImage((i-1),(j));
S4 = NoisyImage((i-2),(j));
S5 = NoisyImage((i-1),(j+1));
S6 = NoisyImage((i-2),(j+2));
S7 = NoisyImage((i),(j-1));
S8 = NoisyImage((i),(j-2));
S9 = NoisyImage(i,j);
S10 = NoisyImage((i),(j+1));
S11 = NoisyImage((i),(j+2));
S12 = NoisyImage((i+1),(j-1));
S13 = NoisyImage((i+2),(j-2));
S14 = NoisyImage((i+1),(j));
S15 = NoisyImage((i+2),(j));
S16 = NoisyImage((i+1)),((j+1));
S17 = NoisyImage((i+2)),((j+2));
TempPixel2=[S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17];
Zmed2=median(TempPixel2);
OutImage(i,j)= Zmed2;
else
OutImage(i,j)= Zmed;
end
end
end
end
end
imshow(OutImage,[]);
title('Adaptive Median Filter')
disp('exit');
%%GLCM Feature Extraction
% Y=rgb2gray(OutImage);
Y=double(OutImage);
% statsArray=[];
% Y=Y{k};
glcm2=graycomatrix(Y);
stats = GLCM_Features1(glcm2,0);
ExtractedFeaturesm16=stats;
% save('ExtractedFeaturesm16.mat')
statsTable = struct2table(stats);
% statsArray = table2array(statsTable);
statsArray1 = table2array(statsTable);
% statsArray'
% [coeff3,score3,latent,~,explained] = pca(statsArray1);
% coeff4 = coeff(:,1:2);
[coeff3,score3,latent,~,explained] = pca(statsArray1);
TrainingSet=[score2(1,:);score2(2,:);score2(3,:);score2(4,:);score2(5,:);score2(6,:);score2(7,:);score2(8,:);
score2(9,:);score2(10,:);score2(11,:);score2(12,:);score2(13,:);score2(14,:);score2(15,:);score2(16,:);
score2(17,:);score2(18,:);score2(19,:);score2(20,:);score2(21,:);score2(22,:);score2(23,:);score2(24,:);
score2(25,:);score2(26,:);score2(27,:);score2(28,:);score2(29,:);score2(30,:);score2(31,:);score2(32,:)]
GroupTrain={'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2',}
TestSet=score3;
SVMModels=cell(2,1);
S=GroupTrain;
classes =unique(S);
rng(1);
% test = TestSet;
% result = multisvm(TrainingSet,classes,test);
for j=1:numel(classes)
indx=strcmp(S',classes(j));
SVMModels{j}=fitcsvm(score2,indx,'ClassNames',[false true],'Standardize',true,'KernelFunction','rbf','BoxConstraint',1);
end
xGrid=TestSet;
for j= 1:numel(classes)
[~,score]=predict(SVMModels{j},xGrid);
Scores(:,j)=score(:,2);
end
[~,maxScore]=max(Scores,[],2);
result=maxScore;
figure,imshow(i)
if result==1
msgbox('Benign')
elseif result==2
msgbox('Malignant')
end
The error message is below:
Error using classreg.learning.classif.ClassificationModel/predictEmptyX (line 203)
X data must have 2 columns.
Error in classreg.learning.classif.ClassificationModel/predict (line 406)
[labels,scores,cost] = predictEmptyX(this,X);
Error in classreg.learning.classif.CompactClassificationSVM/predict (line 433)
predict@classreg.learning.classif.ClassificationModel(this,X,varargin{:});

 채택된 답변

Mahesh Taparia
Mahesh Taparia 2020년 6월 19일

0 개 추천

Hi
From your code and the error message, it seems the variable xGrid did not have the 2 columns.
[~,score]=predict(SVMModels{j},xGrid);
Check the dimension of xGrid, there may be dimensional mismatch/ not properly arranges/you might have missed the data.

댓글 수: 5

Warid Islam
Warid Islam 2020년 6월 19일
Hi @Mahesh,
Thank you for the response. You are correct. xGrid didn't have two columns. It is actually the features extracted from the test image. It has 22 columns and one row. I am actually confused on how to apply PCA on a single row. Do you recommend taking just the first two columns only? do you think the result would be valid then?
Mahesh Taparia
Mahesh Taparia 2020년 6월 19일
Hi Warid
Number of columns will be same as the number of columns you have used to train the model using fitcsvm. Regarding PCA, you can reduce to any number of dimension. It depends how much variance you want in data. For more information on PCA, you can refer to this documentation.
Hi @Mahesh,
I have applied PCA on a 1*22 array(1 row and 22 column).
[coeff,score,latent,explained]=pca(statsArray1)
However, all the values of the variables are empty. I was wondering what could be the cause for this issue. Thank you.
Hi
Atleast take the number of data to be 2 or more. For example, consider below:
a=randn(2,20);
[coeff,score,latent]=pca(a,'NumComponents',10);
Warid Islam
Warid Islam 2020년 6월 29일
Thank you Mahesh..

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Dimensionality Reduction and Feature Extraction에 대해 자세히 알아보기

제품

릴리스

R2019a

질문:

2020년 6월 16일

댓글:

2020년 6월 29일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by