数字水印 | 奇异值分解 SVD 的 Python 代码实现

🥑原理:数字水印 | 奇异值分解 SVD 的定义、原理及性质

🥑参考:Python 机器学习笔记:奇异值分解(SVD)算法



正文

对于一个图像矩阵,我们总可以将其分解为以下形式:

在这里插入图片描述

通过选取不同个数 Σ \Sigma Σ 矩阵中的奇异值,就可以实现图像的压缩。

如果你没有了解过原理,那么你当然看不懂这是什么意思😇

如果想要实现图像的压缩,那么可以先使用 n u m p y \mathsf{numpy} numpy 库中的 linalg.svd 函数对图像矩阵进行分解,然后提取前 k k k 个奇异值以实现 SVD 图像压缩效果。下面让我们看一下代码。



1 核心代码

定义 s v d _ c o m p r e s s i o n \mathsf{svd\_compression} svd_compression 函数:

def svd_compression(img, k):res_image = np.zeros_like(img)for i in range(img.shape[2]):U, Sigma, VT = np.linalg.svd(img[:, :, i])res_image[:, :, i] = U[:, :k].dot(np.diag(Sigma[:k])).dot(VT[:k, :])return res_image

参数说明:

  • i m g \mathsf{img} img 是待处理的图像
  • k \mathsf{k} k 用于设置选定前 k k k 个奇异值

代码说明:

初始化 r e s _ i m a g e \mathsf{res\_image} res_image 变量,用于存放处理结果:

res_image = np.zeros_like(img)

循环压缩每一个通道:

for i in range(img.shape[2]):U, Sigma, VT = np.linalg.svd(img[:, :, i])res_image[:, :, i] = U[:, :k].dot(np.diag(Sigma[:k])).dot(VT[:k, :])
  • 参数: i m g . s h a p e [ 2 ] \mathsf{img.shape[2]} img.shape[2] 是图像的通道个数
  • 第一行:对第 i i i 个通道进行 SVD 分解
  • 第二行:取前 k k k 个奇异值重新构造图像

说明:由于 S i g m a \mathsf{Sigma} Sigma 矩阵除对角元素外,其余元素都为 0 \mathsf{0} 0,因此 linalg.svd 函数将其处理为一维矩阵返回。在重新构造图像时,我们需要使用 np.diag 函数将其还原为对角矩阵。



2 完整代码

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('white_bear.jpg')
img = img[:, :, [2, 1, 0]]
print('image shape is ', img.shape)def svd_compression(img, k):res_image = np.zeros_like(img)for i in range(img.shape[2]):U, Sigma, VT = np.linalg.svd(img[:, :, i])res_image[:, :, i] = U[:, :k].dot(np.diag(Sigma[:k])).dot(VT[:k, :])return res_image# 保留前 k 个奇异值
res1 = svd_compression(img, k=300)
res2 = svd_compression(img, k=200)
res3 = svd_compression(img, k=100)
res4 = svd_compression(img, k=50)plt.subplot(1, 5, 1)
plt.title("image", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(img, cmap='gray')plt.subplot(1, 5, 2)
plt.title("image", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(res1, cmap='gray')plt.subplot(1, 5, 3)
plt.title("u", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(res2, cmap='gray')plt.subplot(1, 5, 4)
plt.title("s", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(res3, cmap='gray')plt.subplot(1, 5, 5)
plt.title("v", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(res4, cmap='gray')plt.show()


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707057.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻松掌握Python中的延时技巧:time模块的妙用

在编程中,我们经常需要让程序暂停一段时间,以便进行某些操作或等待某些事件发生。Python提供了多种方式来实现延时,其中最常用的是time模块。本文将详细讲解如何使用time模块来实现延时操作,并提供几个实用的示例代码。 基本原理…

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服: 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型: proxy代理仓库:代理远程仓库,访问全球中央仓库或其他公共仓库,将资源存储在私…

MySQL单表查询案例演示

目录 一、创建数据库lianxi 二、选择数据库为lianxi 三、新建一个数据表grade,在grade表中插入数据 四、开始进行查询操作(验证表中数据) 1、查询1945班的成绩信息 2、查询1945班,语文成绩大于60小于90的成绩信息 3、查询学…

Elasticsearch - HTTP

文章目录 安装基本语法索引创建索引查看索引删除索引 文档创建文档更新文档匹配查询多条件查询聚合查询映射 安装 https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0 下载完成启动bin/elasticsearch服务,可以在Postman调试各种请求。 基本语法…

wamp 安装 PHP8

最近的项目需求,需要将PHP 升级8使用,一直都是用wamp ,所以需要在wamp集成PHP8 1、首先下载 php8 的包。地址: PHP: Downloadshttps://www.php.net/downloads.php 下载版本是目前最新的 PHP8.3.7,不要下载nts 版本&a…

动态规划高频问题(算法村第十九关白银挑战)

最少硬币数 322. 零钱兑换 - 力扣(LeetCode) 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总…

各种姿势打穿企业内网

以前不是说要讲隧道吗??? 鸽了这么久终于想起来了!!! 1.本次实验环境拓扑 先来讲一下本次的实验环境吧,这样会更加清晰明了一点 首先我们是拿到了win7,然后最终目标上线内网的Wi…

ubuntu 计算器 gnome-calculator

sudo apt install gnome-calculator gnome-calculator

霍庭格TruPlasma MF 7100 7050电源现货50KW

霍庭格TruPlasma MF 7100 7050电源现货50KW

文档分类FastText模型 (pytorch实现)

文档分类FastText FastText简介层次softmaxN-gram特征FastText代码(文档分类) FastText简介 FastText与之前介绍过的CBOW架构相似,我们先来会议一下CBOW架构,如下图: CBOW的任务是通过上下文去预测中间的词&#xff0…

详解动态规划之01背包问题及其空间压缩(图文并茂+例题讲解)

1. 动态规划问题的本质 记忆化地暴力搜索所有可能性来得到问题的解 我们常常会遇到一些问题,需要我们在n次操作,且每次操作有k种选择时,求出最终需要的最小或最大代价。处理类似的问题,我们一般需要遍历所有的可能性(相当于走一遍…

STM32-串口通信波特率计算以及寄存器的配置详解

您好,我们一些喜欢嵌入式的朋友一起建立的一个技术交流平台,本着大家一起互相学习的心态而建立,不太成熟,希望志同道合的朋友一起来,抱歉打扰您了QQ群372991598 串口通信基本原理 处理器与外部设备通信的两种方式 并行…