clc; clear; oi=imread('lena.bmp'); [orow,ocol]=size(oi); pixelcount=orow*ocol;%计算总像素个数 count=floor(pixelcount/8);%总像素分为8个一组 wi=oi(:); for i=1:count%用于存放56比特 for j=1:56 l(i,j)=uint8(0);%输入代码 end end k=1; i=1; for i=1:count wherestart=8*(i-1); for j=1:8 b(i,j)=wi(wherestart+j); end end %把每个像素值的高7位取出,顺序为2、3、4、5、6、7、8 modcount=1; for i=1:count for j=1:8 for k=1:7 l(i,7*(j-1)+k)=bitget(b(i,j),k+1); modcount=modcount+1;%输入代码 end end end %把所有的56位的值按照模2加得到一个56位长度的Checksum值 z=sum(l,1); for i=1:56 z(l,1)=mod(z(l,1),2); %输入代码 end %从图像中随机选取56个像素点 key=123%用户选取随机嵌入的位置 z=uint8(z); [row,col]=randselect(oi,56,key); for k=1:56 temp(k)=oi(row(k),col(k)); temp1=str2bit(temp(k)); temp1(8)=z(k); oi(row(k),col(k))=bit2str(temp1); end imwrite(oi,'watermarked.bmp','bmp'); figure; subplot(1,2,1);imshow('lena.bmp');title('原始图像'); subplot(1,2,2);imshow('watermarked.bmp');title('添加水印信息的图像');
时间: 2024-04-21 20:26:31 浏览: 90
这段代码是一个图片水印嵌入的示例程序,其中包含了以下主要步骤:
1. 读取lena.bmp图像,并计算出该图像的像素总数。
2. 将每个像素值的高7位取出,存放在数组b中。
3. 将每个像素值的高7位二进制位按顺序存放在数组l中,用于存放56位比特。
4. 计算出所有的56位比特的Checksum值。
5. 随机选取56个像素点,并将56位Checksum值嵌入到这些像素中的最低位二进制位中。
6. 将嵌入了水印信息的图像保存到watermarked.bmp中,并在画布中显示原始图像和添加了水印信息的图像。
需要注意的是,这段代码中的随机选取56个像素点的位置是由用户选取的,因此嵌入水印信息的安全性取决于用户选取的随机位置的随机性和保密性。如果想要更加安全地嵌入水印信息,建议使用更加复杂的算法或者密码学技术来进行加密和解密。
相关问题
根据提示,补充代码,并在图片中嵌入秘密信息。 clc; clear; oi=imread('lena.bmp'); [orow,ocol]=size(oi); pixelcount= ;%计算总像素个数 count= ;%总像素分为8个一组 wi=oi(:); for i=1:count%用于存放56比特 for j=1:56 %输入代码 end end k=1; i=1; for i=1:count wherestart=8*(i-1); for j=1:8 b(i,j)=wi(wherestart+j); end end %把每个像素值的高7位取出,顺序为2、3、4、5、6、7、8 modcount=1; for i=1:count for j=1:8 for k=1:7 %输入代码 end end end %把所有的56位的值按照模2加得到一个56位长度的Checksum值 z=sum(l,1); for i=1:5 %输入代码 end %从图像中随机选取56个像素点 key=123%用户选取随机嵌入的位置 z=uint8(z); [row,col]=randselect(oi,56,key); for k=1:56 temp(k)=oi(row(k),col(k)); temp1=str2bit(temp(k)); temp1(8)=z(k); oi(row(k),col(k))=bit2str(temp1); end imwrite(oi,'watermarked.bmp','bmp'); figure; subplot(1,2,1);imshow('lena.bmp');title('原始图像'); subplot(1,2,2);imshow('watermarked.bmp');title('添加水印信息的图像');
clc; clear; oi=imread('lena.bmp'); [orow,ocol]=size(oi); pixelcount=orow*ocol;%计算总像素个数 count=floor(pixelcount/8);%总像素分为8个一组 wi=oi(:); for i=1:count%用于存放56比特 for j=1:56 %输入代码 b((i-1)*56+j)=bitget(wi((i-1)*8+j),1); end end k=1; i=1; for i=1:count wherestart=(i-1)*56; for j=1:8 l(i,j)=bin2dec(num2str(b(wherestart+(j-1)*7+2:wherestart+j*7))); end end %把每个像素值的高7位取出,顺序为2、3、4、5、6、7、8 modcount=1; for i=1:count for j=1:8 for k=1:7 l(i,j)=bitset(l(i,j),k,b(modcount)); modcount=modcount+1; end end end %把所有的56位的值按照模2加得到一个56位长度的Checksum值 z=sum(l,1); for i=1:5 lbit=dec2bin(z(i),7); if mod(sum(lbit=='1'),2)==0 z(i,8)=1; else z(i,8)=0; end end %从图像中随机选取56个像素点 key=123;%用户选取随机嵌入的位置 z=uint8(z); [row,col]=randselect(oi,56,key); for k=1:56 temp(k)=oi(row(k),col(k)); temp1=str2bit(temp(k)); temp1(8)=z(k); oi(row(k),col(k))=bit2str(temp1); end imwrite(oi,'watermarked.bmp','bmp'); figure; subplot(1,2,1);imshow('lena.bmp');title('原始图像'); subplot(1,2,2);imshow('watermarked.bmp');title('添加水印信息的图像');
close all; clear all; clc; I=imread('lenna.bmp'); BW1=im2bw(I,0.4); BW2=im2bw(I,0.6); set(0,'defaultFigurePosition',[200,200,1000,500]); set(0,'defaultFigureColor',[1,1,1]); subplot(131),imshow(I); subplot(132),imshow(BW1); subplot(133),imshow(BW2);
这段代码是用 MATLAB 对一张名为 "lenna.bmp" 的图片进行处理,将其转化为二值图像,然后将原图像和两个二值图像在一个 1x3 的子图中显示出来。其中,im2bw() 函数将灰度图像转化为二值图像,第二个参数为阈值,可调整二值化的效果。set() 函数用于设置 MATLAB 的默认图像属性,包括图像位置和背景颜色。subplot() 函数用于在同一张画布上显示多个子图。
阅读全文