zw = zero_watermark zw = 255 * (zw - zw.min()) / (zw.max() - zw.min()) zw = np.array(zw, np.int) cv2.imwrite('zero_watermark.png', zw)
时间: 2024-03-28 10:38:41 浏览: 14
这段代码的作用是将名为 `zero_watermark` 的变量进行归一化处理,并将其转换成 `np.int` 类型的数组,然后将数组保存为名为 `zero_watermark.png` 的图像文件。具体实现方式是将 `zero_watermark` 数组中的最小值设为0,最大值设为255,并将其它值按比例映射到0到255之间。最后将映射后的结果转换成整数类型,并使用 `cv2.imwrite()` 函数保存为图像文件。
相关问题
clc clear % 读取音频文件A和水印音频 audio_A = audioread('D:/school/毕业设计/音频回声3.wav'); watermark_audio = 'CESHI SHUIYIN'; % 提取水印音频的LSB算法嵌入的水印信息 watermark_bits = de2bi(round((watermark_audio+1)/2 * 255)); watermark = watermark_bits(:, end); % 在音频A中查找水印信息 window_size = length(watermark_audio); step_size = window_size / 2; n_windows = floor((length(audio_A) - window_size) / step_size) + 1; found_watermark = false; for i = 1:n_windows start_idx = (i-1) * step_size + 1; end_idx = start_idx + window_size - 1; window_audio = audio_A(start_idx:end_idx); % 提取窗口中的LSB算法嵌入的水印信息 bits = de2bi(round((window_audio+1)/2 * 255)); window_watermark = bits(:, end); % 比较水印信息是否匹配 if isequal(watermark, window_watermark) found_watermark = true; break; end end if found_watermark % 检测水印受损的位置 damaged_idx = detect_watermark_damage(window_watermark); % 抹零受损的水印位置 window_watermark(damaged_idx) = 0; % 将处理后的水印信息重新嵌入到音频中 bits(:, end) = window_watermark; watermarked_audio = bi2de(bits) / 255 * 2 - 1; % 将处理后的音频保存到文件中 audio_A(start_idx:end_idx) = watermarked_audio; audiowrite('watermarked_audio_A.wav', audio_A, 48000); else disp('Watermark not found in audio A.'); end
这段代码实现了在音频文件中嵌入水印并且检测和修复水印受损的过程。代码主要分为以下几个步骤:
1. 读取音频文件A和水印音频
```matlab
audio_A = audioread('D:/school/毕业设计/音频回声3.wav');
watermark_audio = 'CESHI SHUIYIN';
```
这里使用 `audioread` 函数读取音频文件A,同时定义了水印音频的内容。
2. 提取水印音频的LSB算法嵌入的水印信息
```matlab
watermark_bits = de2bi(round((watermark_audio+1)/2 * 255));
watermark = watermark_bits(:, end);
```
这里使用 `de2bi` 函数将水印音频转化为二进制位,然后提取其中的最后一位作为水印信息。
3. 在音频A中查找水印信息
```matlab
window_size = length(watermark_audio);
step_size = window_size / 2;
n_windows = floor((length(audio_A) - window_size) / step_size) + 1;
found_watermark = false;
for i = 1:n_windows
start_idx = (i-1) * step_size + 1;
end_idx = start_idx + window_size - 1;
window_audio = audio_A(start_idx:end_idx);
% 提取窗口中的LSB算法嵌入的水印信息
bits = de2bi(round((window_audio+1)/2 * 255));
window_watermark = bits(:, end);
% 比较水印信息是否匹配
if isequal(watermark, window_watermark)
found_watermark = true;
break;
end
end
```
这里将音频A分成多个窗口,分别查找其中是否包含了水印信息。具体实现是,每次取一个窗口,提取窗口中的LSB算法嵌入的水印信息,然后与原始水印信息做比较。如果匹配成功,则说明在这个窗口中找到了水印信息。
4. 检测水印受损的位置
```matlab
damaged_idx = detect_watermark_damage(window_watermark);
```
这里调用了一个名为 `detect_watermark_damage` 的函数,用于检测水印受损的位置。具体实现可以在代码中找到。
5. 抹零受损的水印位置
```matlab
window_watermark(damaged_idx) = 0;
```
将受损的水印位置设为0。
6. 将处理后的水印信息重新嵌入到音频中
```matlab
bits(:, end) = window_watermark;
watermarked_audio = bi2de(bits) / 255 * 2 - 1;
```
将处理后的水印信息重新嵌入到音频中,得到新的音频文件。
7. 将处理后的音频保存到文件中
```matlab
audio_A(start_idx:end_idx) = watermarked_audio;
audiowrite('watermarked_audio_A.wav', audio_A, 48000);
```
将处理后的音频保存到文件中。
需要注意的是,这段代码中包含了一些自定义函数(例如 `detect_watermark_damage`),这里没有给出完整代码,可能会影响整个代码的运行。
vm.admin_reserve_kbytes = 8192 vm.block_dump = 0 vm.compact_unevictable_allowed = 1 vm.dirty_background_bytes = 0 vm.dirty_background_ratio = 10 vm.dirty_bytes = 0 vm.dirty_expire_centisecs = 3000 vm.dirty_ratio = 20 vm.dirty_writeback_centisecs = 500 vm.dirtytime_expire_seconds = 43200 vm.drop_caches = 3 vm.extfrag_threshold = 500 vm.hugepages_treat_as_movable = 0 vm.hugetlb_shm_group = 0 vm.laptop_mode = 0 vm.legacy_va_layout = 0 vm.lowmem_reserve_ratio = 256 256 32 1 vm.max_map_count = 65530 vm.memory_failure_early_kill = 0 vm.memory_failure_recovery = 1 vm.min_free_kbytes = 67584 vm.min_slab_ratio = 5 vm.min_unmapped_ratio = 1 vm.mmap_min_addr = 65536 vm.mmap_rnd_bits = 28 vm.mmap_rnd_compat_bits = 8 vm.nr_hugepages = 0 vm.nr_hugepages_mempolicy = 0 vm.nr_overcommit_hugepages = 0 vm.numa_stat = 1 vm.numa_zonelist_order = Node vm.oom_dump_tasks = 1 vm.oom_kill_allocating_task = 0 vm.overcommit_kbytes = 0 vm.overcommit_memory = 0 vm.overcommit_ratio = 50 vm.page-cluster = 3 vm.panic_on_oom = 0 vm.percpu_pagelist_fraction = 0 vm.stat_interval = 1 vm.swappiness = 60 vm.user_reserve_kbytes = 131072 vm.vfs_cache_pressure = 100 vm.watermark_scale_factor = 10 vm.zone_reclaim_mode = 0
这是一个包含多个与虚拟内存相关的系统参数的列表。以下是其中一些参数的解释:
- `vm.max_map_count`:最大映射数量,限制了内存中可以同时映射的页面数量,从而影响了缓存的大小。
- `vm.dirty_background_bytes` 和 `vm.dirty_background_ratio`:脏页的阈值,当脏页的数量超过该阈值时,系统会开始写回脏页。
- `vm.dirty_bytes` 和 `vm.dirty_ratio`:系统允许脏页占用的内存大小的上限。
- `vm.min_free_kbytes`:系统保留的空闲内存的大小,当空闲内存低于该值时,系统会开始清理缓存。
- `vm.swappiness`:控制系统在内存不足时使用交换空间的程度,该参数的值越高,系统越可能使用交换空间。
你可以使用 `sysctl` 命令来修改这些参数的值,具体的命令如下:
```
sysctl -w <parameter>=<value>
```
其中 `<parameter>` 表示参数名,`<value>` 表示你希望设置的值。请注意,该命令的修改是临时的,如果你想要永久生效,需要将修改写入到 `/etc/sysctl.conf` 配置文件中。