matlab学习(三)(4.9-4.15)

一、空域里LSB算法的原理

1.原理:

LSB算法通过替换图像像素的最低位来嵌入信息。这些被替换的LSB序列可以是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。

2.实现步骤:

(1)将图像文件中的所有像素点以RGB形式分隔开,并将各个颜色分量转换成二进制表示。

(2)把每个颜色分量值的最后一位全部设置成0,这不会影响图像的显示格式,但可以在该位置存放信息。

(3)将水印字符转化为二进制字符串,并将这些信息依次填入颜色分量的最低位上,即可完成信息的嵌入。

(4)要提取信息,只需将图像像素的最低位依次提取出来并进行拼接,即可得到原始信息

3.matlab中代码实现:

% 读取原始图像和水印图像

I = imread('test6.jpg');

I = rgb2gray(I);

watermark = imread('ws2.jpg');

watermark = rgb2gray(watermark);

% 调整水印图像的大小,使其与原始图像相同

M, N\] = size(I); watermark = imresize(watermark, \[M, N\]); % 将水印嵌入到原始图像中 watermarked_image = I; for i = 1:M for j = 1:N % 将原图像的最低有效位值换为水印的值 watermarked_image(i, j) = bitset(I(i, j), 1, watermark(i, j)); end end % 提取水印 extracted_watermark = zeros(M, N); for i = 1:M for j = 1:N % 从嵌入水印图像中提取水印 extracted_watermark(i, j) = bitget(watermarked_image(i, j), 1); end end % 显示图像 figure; subplot(2, 2, 1); imshow(I); title('原始图像'); subplot(2, 2, 2); imshow(watermark); title('水印图像'); subplot(2, 2, 3); imshow(watermarked_image); title('嵌入后的图像'); subplot(2, 2, 4); imshow(extracted_watermark); title('提取水印后的图像');

二、插值扩展算法的原理

1.原理:

插值算法是一种根据已知数据点来预测未知数据点值的方法。在图像领域中,我们常用插值算法来修改图像尺寸。常见的插值方法有两种:

(1)最近邻插值(Nearest Interpolation): 最近邻插值从原图像矩阵中找到与目标图像像素点距离最近的点,然后将最近点的像素值赋给目标像素点。 计算目标图像像素坐标与原图像像素坐标的对应关系,通过四舍五入来找到最近的点。 尽管最近邻插值计算量较小,但可能会在灰度变化处产生明显的锯齿现象。

(2)线性插值(Linear Interpolation): 线性插值需要找到周围最近的两个点进行插值运算。 单线性插值通过两个最近邻点的加权平均来估计未知点的像素值。 双线性插值在两个方向分别进行一次线性插值,得到目标像素点的值。

插值扩展算法通常属于线性插值的一种扩展。

2.两种方法的实现步骤:

3.插值算法的维度:

(1)一维interpl插值算法:

该算法适用于已知一系列离散数据点的情况下,通过插值计算得到任意一点的函数值。 具体步骤包括:输入一组已知的离散数据点 ((x_i, y_i)),其中 (x_i) 是自变量,(y_i) 是因变量。 对数据点按照 (x) 值从小到大进行排序。 对于给定的待插值点 (x),找到插值区间 ([x_i, x_{i+1}]),使得 (x_i \leq x \leq x_{i+1})。 利用已知点之间的直线作为插值函数,即根据公式 [ f(x) = \frac{x_{i+1} - x}{x_{i+1} - x_i}y_i + \frac{x - x_i}{x_{i+1} - x_i}y_{i+1} ] 计算出插值点 (x) 的函数值 (f(x))。 输出插值点 (x) 的函数值 (f(x))。

(2)二维interp2插值算法:

该算法适用于已知二维离散数据点的情况下,通过插值计算得到任意一点的函数值。 具体步骤类似于一维插值,但在二维平面上进行插值。 输出插值点 ((x, y)) 的函数值 (f(x, y))。

4.在matlab中代码实现:

% 读取原始图像

originalImage = imread('test7.jpg');

% 设置目标图像的尺寸(例如,扩大2倍)

targetWidth = size(originalImage, 2) * 2;

targetHeight = size(originalImage, 1) * 2;

% 使用双线性插值算法进行图像扩展

expandedImage = imresize(originalImage, [targetHeight, targetWidth], 'bilinear');

% 显示原始图像和扩展后的图像

figure;

subplot(1, 2, 1);

imshow(originalImage);

title('原始图像');

subplot(1, 2, 2);

imshow(expandedImage);

title('扩展后的图像');

% 可选:保存扩展后的图像

imwrite(expandedImage, 'expanded_test7.jpg');

% 注意:您需要将此代码保存为.m文件并在MATLAB中运行。

5.运行结果:

相关推荐
Chef_Chen4 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电4 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
海的诗篇_5 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
曹勖之5 小时前
UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误
matlab·ue5·机器人
AgilityBaby5 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby5 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA6 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽7 小时前
git 学习
git·学习
曹勖之8 小时前
simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出?
matlab
Moonnnn.9 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习