In this code, I want to encrypt the image using a nine-dimensional chaos system. so in the beginning we enter the image with dimensions [M N]= 512x512x3 where M is row and M is col. Here is the code:
I1=imread('Aletta.(Isekai.Shokudou).600.2121109.jpg');
I=imresize(I1,[512 512]);
[M,N]=size(I);
rounds=2;
% To Make Sure That image size is even
if mod(M,2)==1
I(M+1,:)=uint8(0);
M=M+1;
end
if mod(N,2)==1
I(:,N+1)=uint8(0);
N=N+1;
end
MN=M*N;
for round_iter=1:rounds
% #2
P=double(I(:));%convert image I to vector P
% #3
x=(sum(P)+MN)/(MN+(2^23));% to clculate initial key
for i=2:9
x(i)=mod(x(i-1)*1e6,1);
end
a=0.5;b1=10/3;b2=3/5;b3=6/5;b4=1/5;b5=4/3;b6=8/3;r=24.00;
L=#(t,x) [-a.*b1.*x(1)-x(2).*x(4)+b4.*x(4)^2+b3.*x(3).*x(5)-a.*b2.*x(7);
-a.*x(2)+x(1).*x(4)-x(2).*x(5)+x(4).*x(5)-(a.*x(9))/2;
-a.*b1.*x(3)+x(2).*x(4)-b4.*x(2)^2-b3.*x(1).*x(5)+a.*b2.*x(8);
-a.*x(4)-x(2).*x(3)-x(2).*x(5)+x(4).*x(5)+(a.*x(9))/2;
-a.*b5.*x(5)+(x(2)^2/2)-(x(4)^2/2);
-b6.*x(6)+x(2).*x(9)-x(4).*x(9);
-b1.*x(7)-r.*x(1)+ 2.*x(5).*x(8)-x(4).*x(9);
-b1.*x(8)+r.*x(3)-2.*x(5).*x(7)+x(2).*x(9);
-x(9)-r.*x(2)+r.*x(4)-2.*x(2).*x(6)+2.*x(4).*x(6)+x(4).*x(7)-x(2).*x(8)];
N0=.9865*MN/3;
MN3=ceil(MN/3);
[T,Y]=ode45(L,[N0 MN3],x);
% #4
L=Y(1:MN3,1:2:5);
L=L(:);L=L(1:MN);
When we run this code, the result showed this error in the encryption part:
Index in position 1 exceeds array bounds. Index must not exceed 73097.
Error in Encrypt
L=Y(1:MN3,1:2:5);
How could I solve this please?
Related
I have been working on Data Compression through SDT algorithm. I have been given a task to compress the data having 20001 points and I successfully compressed it into 944 points. Now I want to plot phasors in MATLAB. How to do it?
I used plot3 command but unfortunately could not get the desired result.
My code:
clear
clc
load('s.mat');
[N,~]=size(a(:,1));
b=[]
s=1; %storage point
a(s,6)=a(1,2); %vs, store the first phasor
a(s,5)=a(1,1); %ts
a(s,7)=a(1,3); %alphas
for n=3:1:N
p=n-1;
vp=a(p,2);
tp=a(p,1);
alphap=a(p,3);
vn=a(n,2);
tn=a(n,1);
alphan=a(n,3);
vs=a(s,6); %vs
ts=a(s,5);%ts
alphas=a(s,7);%alphas
for i=s+1:n-1 %Condtion for Vi and Current Points
ti=a(i,1);
alphai=a(i,3);
vi=a(i,2)*(cos(alphai)+1i*sin(alphai));%Phasors (Vi)
vcomp=((vn-vs)/(tn-ts))*(ti-ts)+vs;
alphacomp=((alphan-alphas)/(tn-ts))*(ti-ts)+alphas;
vcpx=vcomp*(cos(alphacomp)+1i*sin(alphacomp));%Phasors (Vcomp)
%Etve condition to convert ploar into rectangular components
e_TVE=norm((vcpx-vi),2)/norm(vi,2);%etve condition
a(i,4)=e_TVE;
if e_TVE<=0.001
continue;
else
s=p;
a(s,6)=vp; %vs
a(s,5)=tp;%ts
a(s,7)=alphap;%alps
% a(s,8)=a(p,6)*(cos(a(p,7))+1i*sin(a(p,7))); %Phasors of Storage point
break;
end
end
end
a(n,6)=vn; %vs,reserve the last data
a(n,5)=tn;%ts
a(n,7)=alphan;%alps
x=1;
for y=1:1:20001
if a(y,5)>0 || a(y,6)>0 || a(y,6)>0
b(x,1)=a(y,5);
b(x,2)=a(y,6);
b(x,3)=a(y,7);
x=x+1;
end
end
Figure 1 is the original (Uncompressed data):
Figure 2 is the compressed data result:
Figure 3 is the desired result:
I have the following code (see below) which I hope is self-explanatory. When I run the code using VEC A1/B1 or VEC A2/B2 commenting out the relevant bits, the code works without issues. But when I use the arrays A and B which is what I actually intend to do, matlab gives me the following error:
Improper assignment with rectangular empty matrix.
It says that the error is in this line of code:
prePr(j,:)=a(a>B(j) & a<B((j+1)))
this suggests that it loops correctly for the condition when i=1 but gets stuck when i=2 which is something I am failing to understand. Would be a great help if someone can offer suggestion. Thank you.
RatePu=31.25;
RatePr=250;
ratioRate=RatePr/RatePu;
A=[1:3,5:11,13:19;2:8,10:16,18:20;];
B=[4,12,20;1,9,17;];
% A=[1:3,5:11,13:19;]; % VEC A1
% A=[2:8,10:16,18:20;]; % VEC A2
% B=[4,12,20;]; % VEC B1
% B=[1,9,17;]; % VEC B2
NumTP=size(A,1);
prePr=zeros(length(B),ratioRate-1);
for i=1:NumTP
a=A(i,:);
b=B(i,:);
if b(1)==1
for j=1:length(b)-1
prePr(j,:)=a(a>B(j) & a<B((j+1)))
end
elseif b(1)>1
for j=1:length(b)
if j==1
prePr(j,1:max(a(a<(b(1)))))=a(a<b(j)) ;
else
prePr(j,:)= a(a>b(j-1) & a<b((j-1)+1))
end
end
end
end
It is because for i=2 you have that prePr is an empty matrix.
I would suggest this:
x==a(a>B(j) & a<B((j+1)));
if numel(x)==0
prePr(j,:)=NaN;
else
prePr(j,:)=x;
end
I keep getting Index exceeds matrix dimensions every time I execute this code:
for i= 1:1;
for j=1:1;
for k=1:1;
YC= YC(:,:,i);
MatrixM= M(:,:,:,j);
Graphmenow= GraphMe(:,:,k);
end
end
end
FinalOutput= [MatrixM];
AYesIdiditNow2=[FinalOutput];
AGraphFinale= Graphmenow;
My code works in the following manner:
1.First, it obtains several images from the training set
2.After loading these images, we find the normalized faces,mean face and perform several calculation.
3.Next, we ask for the name of an image we want to recognize
4.We then project the input image into the eigenspace, and based on the difference from the eigenfaces we make a decision.
5.Depending on eigen weight vector for each input image we make clusters using kmeans command.
Source code i tried:
clear all
close all
clc
% number of images on your training set.
M=1200;
%Chosen std and mean.
%It can be any number that it is close to the std and mean of most of the images.
um=60;
ustd=32;
%read and show images(bmp);
S=[]; %img matrix
for i=1:M
str=strcat(int2str(i),'.jpg'); %concatenates two strings that form the name of the image
eval('img=imread(str);');
[irow icol d]=size(img); % get the number of rows (N1) and columns (N2)
temp=reshape(permute(img,[2,1,3]),[irow*icol,d]); %creates a (N1*N2)x1 matrix
S=[S temp]; %X is a N1*N2xM matrix after finishing the sequence
%this is our S
end
%Here we change the mean and std of all images. We normalize all images.
%This is done to reduce the error due to lighting conditions.
for i=1:size(S,2)
temp=double(S(:,i));
m=mean(temp);
st=std(temp);
S(:,i)=(temp-m)*ustd/st+um;
end
%show normalized images
for i=1:M
str=strcat(int2str(i),'.jpg');
img=reshape(S(:,i),icol,irow);
img=img';
end
%mean image;
m=mean(S,2); %obtains the mean of each row instead of each column
tmimg=uint8(m); %converts to unsigned 8-bit integer. Values range from 0 to 255
img=reshape(tmimg,icol,irow); %takes the N1*N2x1 vector and creates a N2xN1 matrix
img=img'; %creates a N1xN2 matrix by transposing the image.
% Change image for manipulation
dbx=[]; % A matrix
for i=1:M
temp=double(S(:,i));
dbx=[dbx temp];
end
%Covariance matrix C=A'A, L=AA'
A=dbx';
L=A*A';
% vv are the eigenvector for L
% dd are the eigenvalue for both L=dbx'*dbx and C=dbx*dbx';
[vv dd]=eig(L);
% Sort and eliminate those whose eigenvalue is zero
v=[];
d=[];
for i=1:size(vv,2)
if(dd(i,i)>1e-4)
v=[v vv(:,i)];
d=[d dd(i,i)];
end
end
%sort, will return an ascending sequence
[B index]=sort(d);
ind=zeros(size(index));
dtemp=zeros(size(index));
vtemp=zeros(size(v));
len=length(index);
for i=1:len
dtemp(i)=B(len+1-i);
ind(i)=len+1-index(i);
vtemp(:,ind(i))=v(:,i);
end
d=dtemp;
v=vtemp;
%Normalization of eigenvectors
for i=1:size(v,2) %access each column
kk=v(:,i);
temp=sqrt(sum(kk.^2));
v(:,i)=v(:,i)./temp;
end
%Eigenvectors of C matrix
u=[];
for i=1:size(v,2)
temp=sqrt(d(i));
u=[u (dbx*v(:,i))./temp];
end
%Normalization of eigenvectors
for i=1:size(u,2)
kk=u(:,i);
temp=sqrt(sum(kk.^2));
u(:,i)=u(:,i)./temp;
end
% show eigenfaces;
for i=1:size(u,2)
img=reshape(u(:,i),icol,irow);
img=img';
img=histeq(img,255);
end
% Find the weight of each face in the training set.
omega = [];
for h=1:size(dbx,2)
WW=[];
for i=1:size(u,2)
t = u(:,i)';
WeightOfImage = dot(t,dbx(:,h)');
WW = [WW; WeightOfImage];
end
omega = [omega WW];
end
% Acquire new image
% Note: the input image must have a bmp or jpg extension.
% It should have the same size as the ones in your training set.
% It should be placed on your desktop
ed_min=[];
srcFiles = dir('G:\newdatabase\*.jpg'); % the folder in which ur images exists
for b = 1 : length(srcFiles)
filename = strcat('G:\newdatabase\',srcFiles(b).name);
Imgdata = imread(filename);
InputImage=Imgdata;
InImage=reshape(permute((double(InputImage)),[2,1,3]),[irow*icol,1]);
temp=InImage;
me=mean(temp);
st=std(temp);
temp=(temp-me)*ustd/st+um;
NormImage = temp;
Difference = temp-m;
p = [];
aa=size(u,2);
for i = 1:aa
pare = dot(NormImage,u(:,i));
p = [p; pare];
end
InImWeight = [];
for i=1:size(u,2)
t = u(:,i)';
WeightOfInputImage = dot(t,Difference');
InImWeight = [InImWeight; WeightOfInputImage];
end
noe=numel(InImWeight);
% Find Euclidean distance
e=[];
for i=1:size(omega,2)
q = omega(:,i);
DiffWeight = InImWeight-q;
mag = norm(DiffWeight);
e = [e mag];
end
ed_min=[ed_min MinimumValue];
theta=6.0e+03;
%disp(e)
z(b,:)=InImWeight;
end
IDX = kmeans(z,5);
clustercount=accumarray(IDX, ones(size(IDX)));
disp(clustercount);
Running time for 100 images:Elapsed time is 103.947573 seconds.
QUESTIONS:
1.It is working fine for M=50(i.e Training set contains 50 images) but not for M=1200(i.e Training set contains 1200 images).It is not showing any error.There is no output.I waited for 10 min still there is no output.What is the problem?Where i was wrong?
To answer your second question, you can simply 'save' any generated variable as a .mat file in your working directory (Current folder) which can be accessed later. So in your code, if the 'training eigenfaces' is given by the variable 'u', you can use the following:
save('eigenface.mat','u')
This creates a .mat file with the name eigenface.mat which contains the variable 'u', the eigenfaces. Note that this variable is saved in your Current Folder.
In a later instance when you are trying out with your test data, you can simply 'load' this variable:
load('eigenface.mat')
This automatically loads 'u' into your workspace.
You can also save additional variables in the same .mat file if necessary
save('eigenface.mat','u','v'...)
The answer to the first question is that the code is simply not done running yet. Vectorizing the code (instead of using a for loop), as suggested in the comment section above can improve the speed significantly.
[EDIT]
Since the images are not very big, the code is not significantly slowed down by the first for loop. You can improve the performance of the rest of the code by vectorizing the code. Vectorized operations are faster than for-loops. This link might be useful in understanding vectorization:
http://www.mathworks.com/help/matlab/matlab_prog/vectorization.html
For example, the second for-loop can be replaced by the following vectorized form, as suggested in the comments
tempS = double(S);
meanS = mean(S,1);
stdS = std(S,0,1);
S = (tempS - meanS) ./ stdS;
Use MATLAB's timer functions tic and toc for finding how long the first for-loop alone is taking to execute. Add tic before the for loop and toc after it. If the time taken for 50 images is about 104 seconds, then it would be significantly more for 1200 images.
I have a project about image compression in Matlab. So far i have successfully implemented Huffman encoding to the image which gives me a vector of binary codes. After that i run Huffman decoding and i get a vector which contains the elements of the image compressed. My problem is that i can find how is possible from this vector to reconstruct the image and create the image file.
Any help would be grateful
Update
Based on Ben A. help i have made progress but i still have some issues.
To be more exact. I have an image matrix. After finding unique symbols(elements) on this image matrix, i calculate the probabilities and then with this function:
function [h,L,H]=Huffman_code(p,opt)
% Huffman code generator gives a Huffman code matrix h,
% average codeword length L & entropy H
% for a source with probability vector p given as argin(1)
zero_one=['0'; '1'];
if nargin>1&&opt>0, zero_one=['1'; '0']; end
if abs(sum(p)-1)>1e-6
fprintf('\n The probabilities in p does not add up to 1!');
end
M=length(p); N=M-1; p=p(:); % Make p a column vector
h={zero_one(1),zero_one(2)};
if M>2
pp(:,1)=p;
for n=1:N
% To sort in descending order
[pp(1:M-n+1,n),o(1:M-n+1,n)]=sort(pp(1:M-n+1,n),1,'descend');
if n==1, ord0=o; end % Original descending order
if M-n>1, pp(1:M-n,n+1)=[pp(1:M-1-n,n); sum(pp(M-n:M-n+1,n))]; end
end
for n=N:-1:2
tmp=N-n+2; oi=o(1:tmp,n);
for i=1:tmp, h1{oi(i)}=h{i}; end
h=h1; h{tmp+1}=h{tmp};
h{tmp}=[h{tmp} zero_one(1)];
h{tmp+1}=[h{tmp+1} zero_one(2)];
end
for i=1:length(ord0), h1{ord0(i)}=h{i}; end
h=h1;
end
L=0;
for n=1:M, L=L+p(n)*length(h{n}); end % Average codeword length
H=-sum(p.*log2(p)); % Entropy by Eq.(9.1.4)
i calculate the huffman codes for the image.
Now i use this function:
function coded_seq=source_coding(src,symbols,codewords)
% Encode a data sequence src based on the given (symbols,codewords).
no_of_symbols=length(symbols); coded_seq=[];
if length(codewords)<no_of_symbols
error('The number of codewords must equal that of symbols');
end
for n=1:length(src)
found=0;
for i=1:no_of_symbols
if src(n)==symbols(i), tmp=codewords{i}; found=1; break; end
end
if found==0, tmp='?'; end
coded_seq=[coded_seq tmp];
end
where in src i put my image (matrix) and i get a coded sequence for my image.
Last is this function:
function decoded_seq=source_decoding(coded_seq,h,symbols)
% Decode a coded_seq based on the given (codewords,symbols).
M=length(h); decoded_seq=[];
while ~isempty(coded_seq)
lcs= length(coded_seq); found=0;
for m=1:M
codeword= h{m};
lc= length(codeword);
if lcs>=lc&codeword==coded_seq(1:lc)
symbol=symbols(m); found=1; break;
end
if found==0, symbol='?'; end
end
decoded_seq=[decoded_seq symbol];
coded_seq=coded_seq(lc+1:end);
end
Which is used to decode the coded sequence. The problem is that finally as coded sequence i get a 1x400 matrix where i should get a 225x400 which is my image dimensions.
Am i missing something? Maybe should i replace something because i have a matrix and not a number sequence (for which the code is written)?
You might want to take a look at this:
http://www.mathworks.com/matlabcentral/answers/2158-huffman-coding-and-decoding-for-image-jpeg-bmp
This seems like it's right up your alley. It should ultimately lead you to here:
http://www.mathworks.com/matlabcentral/fileexchange/26384-ppt-for-chapter-9-of-matlabsimulink-for-digital-communication