1
+ #include < bits/stdc++.h>
2
+ #include < opencv2/opencv.hpp>
3
+
4
+ using namespace cv ;
5
+ using namespace std ;
6
+
7
+ const int MAX=1e4 +79 ;
8
+
9
+ /* *
10
+ u is the control parameter for logistic chaotic map,also known as population rate
11
+ Here u is taken 3.94
12
+ x is the vector that contain the value generated by chaotic map
13
+ The initial value of the logistic chaotic map is 0.4
14
+ */
15
+
16
+ int main ()
17
+ {
18
+ Mat image,encImage1,encImage2,tempImage;
19
+ int i,l;
20
+ double u1=3.94001 ,u2=3.94002 ,percenDiff,count=0 ;
21
+ vector<pair<double ,int >> x1,x2;
22
+ Vec<unsigned char , 3 > pixel,pixel1;
23
+
24
+
25
+ image = imread (" Image/sample_image_grey.jpg" , 0 );
26
+ if ( !image.data )
27
+ {
28
+ cout<<" No image data \n " ;
29
+ return -1 ;
30
+ }
31
+
32
+ x1.push_back ({0.400001 ,0 });
33
+ x2.push_back ({0.400002 ,0 });
34
+
35
+ // cout<<u1<<endl<<u2<<endl;
36
+ // cout<<x1[0].first<<endl<<x2[0].first<<endl;
37
+
38
+ double temp;
39
+ for (int i = 1 ; i <= 511 ; ++i){
40
+ temp=u1*x1[i-1 ].first *(1 -x1[i-1 ].first );
41
+ x1.push_back ({temp,i});
42
+ }
43
+
44
+ for (int i = 1 ; i <= 511 ; ++i){
45
+ temp=u2*x2[i-1 ].first *(1 -x2[i-1 ].first );
46
+ x2.push_back ({temp,i});
47
+ }
48
+
49
+ sort (x1.begin (), x1.end ());
50
+ sort (x2.begin (), x2.end ());
51
+
52
+ imshow (" Original image" , image);
53
+ waitKey (0 );
54
+
55
+ i=0 ;
56
+ tempImage=image;
57
+ for (int r = 0 ; r < image.rows ; ++r) {
58
+ for (int c = 0 ; c < image.cols ; ++c) {
59
+ if (i>511 )
60
+ i=0 ;
61
+ int temps= x1[i].second ;
62
+
63
+ pixel= image.at <Vec3b>(r,temps);
64
+ image.at <Vec3b>(r,temps)=image.at <Vec3b>(r,c);
65
+ image.at <Vec3b>(r,c)=pixel;
66
+
67
+ i++;
68
+ }
69
+ }
70
+
71
+ for (int r = 0 ; r < image.rows ; ++r) {
72
+ for (int c = 0 ; c < image.cols ; ++c) {
73
+ if (i>100 ){
74
+ i=1 ;
75
+ }
76
+ l=x1[i].first *MAX;
77
+ l=l%255 ;
78
+ image.at <Vec3b>(r,c)[0 ]=image.at <Vec3b>(r,c)[0 ]^l;
79
+ image.at <Vec3b>(r,c)[1 ]=image.at <Vec3b>(r,c)[1 ]^l;
80
+ image.at <Vec3b>(r,c)[2 ]=image.at <Vec3b>(r,c)[2 ]^l;
81
+ i++;
82
+ }
83
+ }
84
+ encImage1=image;
85
+ image=tempImage;
86
+
87
+ i=0 ;
88
+ tempImage=image;
89
+ for (int r = 0 ; r < image.rows ; ++r) {
90
+ for (int c = 0 ; c < image.cols ; ++c) {
91
+ if (i>511 )
92
+ i=0 ;
93
+ int temps= x2[i].second ;
94
+
95
+ pixel= image.at <Vec3b>(r,temps);
96
+ image.at <Vec3b>(r,temps)=image.at <Vec3b>(r,c);
97
+ image.at <Vec3b>(r,c)=pixel;
98
+
99
+ i++;
100
+ }
101
+ }
102
+
103
+ for (int r = 0 ; r < image.rows ; ++r) {
104
+ for (int c = 0 ; c < image.cols ; ++c) {
105
+ if (i>100 ){
106
+ i=1 ;
107
+ }
108
+ l=x2[i].first *MAX;
109
+ l=l%255 ;
110
+ image.at <Vec3b>(r,c)[0 ]=image.at <Vec3b>(r,c)[0 ]^l;
111
+ image.at <Vec3b>(r,c)[1 ]=image.at <Vec3b>(r,c)[1 ]^l;
112
+ image.at <Vec3b>(r,c)[2 ]=image.at <Vec3b>(r,c)[2 ]^l;
113
+ i++;
114
+ }
115
+ }
116
+
117
+ encImage2=image;
118
+ image=tempImage;
119
+
120
+ for (int r = 0 ; r < image.rows ; ++r) {
121
+ for (int c = 0 ; c < image.cols ; ++c) {
122
+ pixel= encImage1.at <Vec3b>(r,c);
123
+ pixel1= encImage2.at <Vec3b>(r,c);
124
+
125
+ if (pixel[0 ] ==pixel[0 ])
126
+ count +=1 ;
127
+ if (pixel[1 ] ==pixel[1 ])
128
+ count +=1 ;
129
+ if (pixel[2 ] ==pixel[2 ])
130
+ count +=1 ;
131
+ }
132
+ }
133
+
134
+ percenDiff=count/(512 *512 *3 )*100 ;
135
+ cout<<" The first image and second encrypted image are " <<percenDiff<<" % Different" <<endl;
136
+
137
+ imwrite (" Image/test_encrypted_image1.jpg" ,encImage1);
138
+ imshow (" Encrypted test image 1" , encImage1);
139
+ waitKey (0 );
140
+ imwrite (" Image/test_encrypted_image2.jpg" ,encImage2);
141
+ imshow (" Encrypted test image 2" , encImage2);
142
+ waitKey (0 );
143
+
144
+ return 0 ;
145
+
146
+ }
0 commit comments