0
点赞
收藏
分享

微信扫一扫

仿真代码之三

部分仿真代码,供参考




%
designed by lilizong
%
lilizong[at]gmail


a
=
imread(
'
c:bbb.png
'
);
%
读入图像
figure,imshow(a),title(
'
原图像
'
);
%
显示图像
figure,imhist(a);
b
=
a(:);
[m,n]
=
size(a);
k
=
size(b);
%
下述操作可以实现像素的显示
c
=
linspace(
0
,
0
,
256
);
for
i
=
1
:k

for
j
=
1
:
256


if
(b(i)
==
j)
c(j)
=
c(j)
+
1
;
end
end
end
%
以下步骤简单实现读取整个图像的峰值点

max
=
c(
1
);
maxi
=
0
;
for
i
=
1
:
256


if
(c(i)
>
max)
max
=
c(i);
maxi
=
i;
end
end
max
maxi




%
下面步骤实现对各个峰值的读取
d
=
c;
%
作为临时操作数组,以不破坏原数组
emax
=
linspace(
0
,
0
,
256
);
emaxi
=
linspace(
0
,
0
,
256
);
a
=
1
;
for
j
=
2
:
256


if
(d(j)
>
d(j
-
1
)
&
d(j)
>
d(j
+
1
)
&
d(j)
~=
8888
)
emax(a)
=
d(j);
emaxi(a)
=
j;
d(j)
=
8888
;
a
=
a
+
1
;
%
开始没有想明白,用额外的循环变量
end
end


%
下面的程序读取四个高峰值,并进行显示
fmax
=
linspace(
0
,
0
,
10
);
fmaxi
=
linspace(
0
,
0
,
10
);
bnum
=
1
;
for
i
=
1
:
10

fmax(bnum)
=
emax(
1
);

for
j
=
2
:
256


if
(emax(j)
>
fmax(bnum))
fmax(bnum)
=
emax(j);
fmaxi(bnum)
=
emaxi(j);
t
=
j;
end
end
emax(t)
=
0
;
bnum
=
bnum
+
1
;
end


for
i
=
1
:
10

fmax(i)
fmaxi(i)
end

%
至此峰值已经提出出来了







%
在第一个峰值嵌入水印
%
首先把小于最大的像素值的都减去2
cc
=
zeros(m,n);
c
=
cc(:);

for
i
=
1
:k

if
(b(i)
<
fmax(
1
))
c(i)
=
b(i)
-
2
;
end
end

watermark
=
imread(
'
c:watermark.png
'
);
figure,imshow(watermark);
[w1,w2]
=
size(watermark);
watermark_line
=
watermark(:);
oo
=
w1
*
w2;

%
开始嵌入水印

%
第一次水印

tt
=
1
;
%
让tt加1来遍历整个水印图像
for
i
=
1
:k

if
(c(i)
==
fmax(
1
))

if
(tt
>
oo)
tt
=
1
;
%
如果超出水印的范围从头开始

if
(watermark_line(tt)
==
1
)
c(i)
=
c(i)
-
1
;
end

end
tt
=
tt
+
1
;
end
end



%
第二次水印
tt
=
1
;
%
让tt加1来遍历整个水印图像
for
i
=
1
:k

if
(c(i)
==
fmax(
2
))

if
(tt
>
oo)
tt
=
1
;
%
如果超出水印的范围从头开始

if
(watermark_line(tt)
==
1
)
c(i)
=
c(i)
-
2
;
end
end
tt
=
tt
+
1
;
elseif(c(i)
==
fmax(
2
)
+
1
)

if
(tt
>
oo)
tt
=
1
;

if
(watermar_line(tt)
==
1
)
c(i)
=
c(i)
-
2
;
end
end
end
end









%
显示嵌入水印的图像


embed
=
c;
embed
=
reshape(c,m,n);
figure,imshow(embed,[]),title(
'
嵌入水印的图像
'
);


%
提取水印

%
提取第一层

for
i
=
1
:k

if
(c(i)
==
fmax(
2
))
watermark(tt)
=
0
;

%
tt
=
tt
+
1
;

%
elseif(c(i)
==
(fmax(
1
)
+
1
))

%
watermark(tt)
=
0
;

%
tt
=
tt
+
1
;

%
elseif(c(i)
=
fmax(
1
)
-
1
)

%
elseif(c(i)
=
fmax(
1
)
-
1
)

%
watermark(tt)
=
1
;

%
tt
=
tt
+
1
;

%
elseif(c(i)
=
fmax(
1
)
-
2
)

%
watermark(tt)
=
1
;

%
tt
=
tt
+
1
;

%
end

else


if
(c(i)
==
fmax(
2
)
+
1
)
watermark(tt)
=
0
;

else


if
(c(i)
==
fmax(
2
)
-
1
)
watermark(tt)
=
1
;

else


if
(c(i)
==
fmax(
2
)
-
2
)
watermark
=
1
;
end
end
end
tt
=
tt
+
1
;
end
end


%
提取第二层


for
i
=
1
:k

if
(c(i)
==
fmax(
1
))
watermark(tt)
=
0
;
tt
=
tt
+
1
;
elseif(c(i)
==
(fmax(
1
)
-
1
))
watermark(tt)
=
1
;
tt
=
tt
+
1
;
end
end
for
i
=
1
:oo
watermark_dect(i)
=
watermark(i);
end











for
i
=
1
:oo
watermark_dect(i)
=
watermark(i);
end
watermark_dect
=
reshape(watermark_dect,w1,w2);
figure,imshow(watermark_dect,[]),title(
'
提取出来的水印
'
);


%
恢复原图像
dd
=
embed(:);
for
i
=
1
:k

if
(c(i)
==
(max
-
2
))
c(i)
=
c(i)
+
2
;
elseif(c(i)
<
max
-
2
)
c(i)
=
c(i)
+
2
;
end
end
dd
=
reshape(c,m,n);
figure,imshow(dd,[]),title(
'
恢复的图像
'
);



a
=
imread(
'
c:bbb.png
'
);

x
=
a;
x1
=
embed;
x
=
double
(x);
x1
=
double
(x1);
for
i
=
1
:
256
;

for
j
=
1
:
256
;
MYa(i,j)
=
x(i,j)
^
2
;
%
after filtering
'
s single

MYb(i,j)
=
x(i,j)
-
x1(i,j);
end
end
d
=
0
;
e
=
0
;
for
i
=
1
:
256
;

for
j
=
1
:
256
;
d
=
d
+
MYa(i,j);
e
=
e
+
MYb(i,j)
*
MYb(i,j);
end
end
f
=
log10(d
/
e);
g
=
10
*
f

举报

相关推荐

0 条评论