Im = imread('szy1.jpg'); In = rgb2gray(Im); I1 = bitget(In, 1); one = I1(1:200,1:200); one = im2bw(uint8(one) * 255); figure; subplot(2,3,3) imshow(one); title('第一层图像'); I = In - (min(In(:))); [M,N] = size(I); subplot(2,3,1) imshow(I); title('载体图像'); message=imread('watermark.bmp');[Mw,Nw]=size(message); subplot(2,3,2) imshow(message);title('原始水印'); embed=I; for i=1:Mw for j=1:Nw embed(i,j)=embed(i,j)-mod(embed(i,j),2)+uint8(message(i,j)); end end subplot(2,3,4) imshow(embed);title('含水印图像');drawnow; imwrite(embed,'ok.bmp') I = imread('ok.bmp'); I0 = bitget(I, 1); waterMark = I0(1:32,1:32); waterMark = im2bw(uint8(waterMark) * 255); subplot(2,3,5) imshow(waterMark); title('提取图像'); waterMark = I0(1:200,1:200); waterMark = im2bw(uint8(waterMark) * 255); subplot(2,3,6) imshow(waterMark); title('第一层加水印图像'); I_double = im2double(I); Im_double = im2double(Im); MSE = mean((I_double(:) - Im_double(:)).^2); PSNR = 10 * log10(1/MSE); fprintf('PSNR = %f dB\n', PSNR); NC = sum(waterMark(:) == one(:)) / numel(one); fprintf('NC = %f\n', NC); diff = abs(waterMark - one); BER = sum(diff(:)) / numel(diff); fprintf('BER = %f\n', BER);修改,矩阵维度不一样
时间: 2024-03-22 16:40:56 浏览: 20
如果原始水印图像和第一层加水印的图像的尺寸不同,需要修改提取水印的代码。假设原始水印图像为 $M_1 \times N_1$,第一层加水印的图像为 $M_2 \times N_2$,可以按照下面的代码进行修改:
```
I0 = bitget(I, 1);
waterMark = I0(1:M1,1:N1); % 提取水印
waterMark = im2bw(uint8(waterMark) * 255);
subplot(2,3,5); imshow(waterMark); title('提取图像');
waterMark = I0(1:M2,1:N2); % 提取第一层加水印的水印
waterMark = im2bw(uint8(waterMark) * 255);
subplot(2,3,6); imshow(waterMark); title('第一层加水印图像的水印');
```
其中,$M_1,N_1$ 是原始水印图像的尺寸,$M_2,N_2$ 是第一层加水印的图像的尺寸。
相关问题
im1 = imread('1.png');im2 = imread('2.png');im3 = imread('3.png'); 如果有40多张图片也要用这个方法嘛
如果你需要读取40多张图片,那么你可以使用循环语句来读取这些图片。比如,你可以使用for循环语句来读取每一张图片,然后对它们进行处理。以下是一个示例代码:
```
for i = 1:40
filename = sprintf('%d.png', i);
im{i} = imread(filename);
% 在这里对读取的图像进行处理
end
```
在上面的代码中,我们使用循环语句将40张图片的名称逐一读取。然后,我们将每张图片读取到一个名为“im”的单元格数组中。在这里,你可以对每张图片进行任何你需要的处理。
matlab im=imread用法
`imread` 是 MATLAB 中读取图像的函数,其基本语法如下:
```
im = imread(filename)
```
其中,`filename` 是要读取的图像文件的路径和名称,`im` 是读取出来的图像数据。
例如,要读取名为 `image.jpg` 的图像文件,可以使用以下代码:
```matlab
im = imread('image.jpg');
```
默认情况下,`imread` 函数会将读取的图像转换为 MATLAB 中的 `uint8` 类型,即每个像素的值在 0-255 之间。如果需要将其转换为其他类型,可以使用 `im2double`、`im2single` 等函数进行转换。
同时,`imread` 函数也支持一些附加参数,以控制读取图像的方式。例如,可以使用 `imread(filename, 'png')` 显式地指定要读取的图像格式为 PNG。更多附加参数的使用可以参考 MATLAB 的官方文档。