I=imread('sy.png'); W=imread('3.jpg'); WR=rgb2gray(W); W2=R_dwt(W); I=imresize(I,size(WR)); Ir=I(:,:,1); Ir=im2double(Ir);%图像转化为双精度值,blockproc函数需要 T=dctmtx(8);%得到8*8正交矩阵 %对图像分块,每块进行离散余弦变换 fun1=@(block_struct) T*block_struct.data*T'; B=blockproc(Ir,[8 8],fun1); %定义掩模矩阵,保留每个数据块中的主要部分 mask = [1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; I2= blockproc(B,[8 8],@(block_struct) mask .* block_struct.data); w_cH2=imsubtract(W2,I2);%对HL2嵌入水印 [M,N]=size(w_cH2); a=mat2cell(w_cH2,[M/2 M/2],[N/2 N/2]); IA2=a{1,1}; IH2=a{1,2}; IV2=a{2,1}; ID2=a{2,2}; W3=idwt2(IA2, IH2, IV2, ID2,'haar'); [IA3, IH3, IV3, ID3] = dwt2(W3, 'haar'); W4=[IA3, IH3; IV3, ID3]; w_cH3=imsubtract(W2,W4);%对HL2嵌入水印 fun3=@(block_struct) T'*block_struct.data*T; I3=blockproc(w_cH3,[8 8],fun3); imshow(w_cH3);
时间: 2023-12-08 20:06:57 浏览: 199
这段代码实现了数字图像水印嵌入的过程。首先,使用 `imread` 函数读取原始图像 `W` 和水印图像 `I`。然后,将 `W` 转换为灰度图像,并对其进行小波变换,将水印图像 `I` 调整为与原始图像 `W` 灰度图像的大小一致,并对其进行DCT变换。接着,定义一个掩模矩阵 `mask`,用于保留每个数据块中的主要部分,并将其与 `I` 中的每个数据块进行点乘,得到加密后的水印信息 `I2`。然后,将加密后的水印信息与原图的小波系数进行差分操作,得到需要嵌入水印的小波系数 `w_cH2`。接下来,将 `w_cH2` 按照Haar小波变换进行逆变换,得到嵌入水印后的图像 `W3`。然后,将 `W3` 再进行一次Haar小波变换,得到新的小波系数 `W4`。接着,将 `W4` 与原图的小波系数进行差分操作,得到需要嵌入水印的小波系数 `w_cH3`。最后,将 `w_cH3` 进行DCT逆变换,得到嵌入水印后的图像 `I3`。在代码的最后,使用 `imshow` 函数显示嵌入水印后的图像。
相关问题
import cv2 import numpy as np gray1 = cv2.imread('green.png', 0) gray2 = cv2.imread('blue.png', 0) gray3 = cv2.imread('red.png', 0) height, width = gray1.shape color_img = np.zeros((height, width, 3), dtype=np.uint8) color_img[:, :, 0] = gray1 color_img[:, :, 1] = gray2 color_img[:, :, 2] = gray3 cv2.imwrite('color_img.jpg', color_img)为什么这段代码产生的图片颜色和原图不一样
这段代码将三个灰度图像合并成一个彩色图像。然而,由于OpenCV中默认的颜色通道顺序是BGR,而不是RGB,所以合并后的图像颜色可能与原图不一样。你可以尝试修改代码,将通道顺序改为RGB,即将以下代码段:
```python
color_img[:, :, 0] = gray1
color_img[:, :, 1] = gray2
color_img[:, :, 2] = gray3
```
改为:
```python
color_img[:, :, 0] = gray3
color_img[:, :, 1] = gray2
color_img[:, :, 2] = gray1
```
这样应该能够得到与原图更一致的彩色图像。另外,请确保灰度图像的路径和文件名正确无误。
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”的单元格数组中。在这里,你可以对每张图片进行任何你需要的处理。
阅读全文