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

news2025/1/19 23:06:04

🥑原理:数字水印 | 奇异值分解 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 plt


img = 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.coloradmin.cn/o/1682197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon 根据XYZ生成3D模型

Halcon 根据XYZ生成3D模型 x_points := [a_x_points, b_x_points, c_x_points]y_points := [a_y_points, b_y_points, c_y_points]z_points := [a_z_points, b_z_points, c_z_points]stop()gen_object_model_3d_from_points

某单位Oracle数据库性能优化方案参考

内容分析: 本文是一篇关于XX市XX单位中心数据库优化方案的详细报告。文章首先描述了数据库的现状,包括其运行的软件环境、硬件环境、数据存储情况以及与检测点的连接方式。接着,文章列出了信息系统优化的常用策略,并具体解释了每一…

线性回归模型之套索回归

概述 本案例是基于之前的岭回归的案例的。之前案例的完整代码如下: import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Ridge, LinearRegression from sklearn.datasets import make_regression from sklearn.model_selectio…

对抗生成网络(GAN),DCGAN原理

目录 1. GAN基础原理 1.1 生成器 1.2 判别器 1.3 整体架构 2. 损失函数 3. DCGAN 3.1 问题 3.2 解决 1. GAN基础原理 GAN(Generative Adversarial Nets)是一种深度神经网络架构。它由生成器和判别器组成,生成器学习真实样本&#x…

微信公众号自定义分销商城小程序源码系统 带完整的安装代码吧以及系统部署搭建教程

系统概述 微信公众号自定义分销商城小程序源码系统是一款功能强大的电商解决方案,它集成了商品管理、订单处理、支付接口、分销管理等多种功能。该系统支持自定义界面设计,商家可根据自身需求调整商城的页面布局和风格,打造独特的品牌形象。…

月薪20K+的策划人简历应该怎么写?

一般咱们大多数策划在写简历前,都是先直接找模板,然后按照模板的框架直接往里面填内容。 最后草草收场,直接拿去海投简历,结果发现没有拿到任何面试邀约。 策划写简历前的第一件事要梳理自己的能力模型和岗位JD。 因为只有先梳…

解决谷歌浏览器无法登陆网站的问题,左下角弹出JavaScript(void:0)

破釜沉舟,全都试一遍: 如果还不行,那就关闭GPU加速:关了瞬间就好了 关闭之后,再打开GPU加速还是行的(咱也不知道为啥呀)

究极完整版!!Centos6.9安装最适配的python和yum,附带教大家如何写Centos6.9的yum.repos.d配置文件。亲测可行!

前言! 这里我真是要被Centos6.9给坑惨了,最刚开始学习linux的时候并没有在意那么的,没有考虑到选版本问题,直到23年下半年,官方不维护Centos6.9了,基本上当时配置的文件和安装的依赖都用不了了&#xff0c…

DCMM(数据管理能力成熟度模型)对企业的价值

随着大数据时代的来临,数据已成为企业发展的重要驱动力。为了有效地管理和利用数据,企业需要建立一套完善的数据管理体系,而DCMM(数据管理能力成熟度模型)正是这样一个帮助企业构建和优化数据管理能力的框架。 DCMM结构…

05-应用级开发者 AI 时代破局点

后端应用级开发者该如何拥抱 AI GC?就是在这样的一个大的浪潮下,我们的传统的应用级开发者。我们该如何选择职业或者是如何去快速转型,跟上这样的一个行业的一个浪潮? 0 AI金字塔模型 越往上它的整个难度就是职业机会也好,或者说…

Ubuntu 24 换国内源及原理 (阿里源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources (阿里源) Types: deb deb-src URIs: https://mirrors.aliyun.com/ubunt…

ArcGIS arcpy代码工具——关于标识码的那些事(查找最大标识码、唯一性检查、重排序、空值赋值)

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

二. Ast - 反混淆(基础篇-api的使用)

在线代码转AST语法树网站:AST explorer 什么是path对象 通过以下的代码,对以上图片中的AST语法树做例子。 VariableDeclarator(path) 是一个函数,表示 traverse 遍历AST时,要进入的节点path 参数,表示当前正在遍历的节…

Conda 常用命令大全

Conda 常用命令大全 配置源conda配置清华源pip配置清华源 环境管理创建一个新的虚拟环境列出虚拟环境激活虚拟环境退出虚拟环境删除虚拟环境复制某个虚拟环境 conda包管理列出全部包安装包卸载包 pip包管理列出全部包安装包卸载包 其他命令查询 conda 版本查看环境信息 简介&am…

某东-绑卡

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章未…

element 表格滚动条滑动,表格错位

解决办法(主要是根据滚动条的宽度决定的,可自行调整) 1、.el-table__header-wrapper { width: 99.3% !important; } 2、.el-table__header-wrapper { padding-right: 10px!important; }

鸿蒙应用布局ArkUI:【其他常用布局容器和组件】介绍

其他常用布局容器和组件 创建轮播(Swiper)实现轮播图功能 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 栅格布局(GridRow/GridCol)和Grid布局类似…

RockTree Capital石木资本品牌升级 沉浸式“加密朋克风”网站震撼上线

总部位于北京的领先的Web3 原生加密基金与投资机构 RockTree Capital 石木资本,宣布推出全新沉浸式网站,在其中呈现一个未来主义电影风格概念:赛博朋克加密城市。这个前沿互动型城市景观代表着 RockTree Capital 对 Web3 普及以及技术、金融与…

白鲸开源CEO郭炜在2024 DataOps发展大会上获聘专家

2024年5月15日,白鲸开源CEO郭炜在2024 DataOps发展大会上被正式聘任为DataOps专家,并获得了荣誉证书。本次大会由中国通信标准化协会主办,中关村科学城管委会提供支持,大数据技术标准推进委员会(CCSATC601)…

5月17日世界电信日:共筑数字桥梁,深圳市企讯通科技引领通讯创新潮流

在全球信息化浪潮中,每年的5月17日被赋予了非凡的意义——“世界电信日”。这不仅仅是全球电信业发展成果展示与未来趋势探讨的盛会,更是对未来通信领域无限可能的展望。自1969年设立以来,世界电信日不断激励着各国在信息通信技术&#xff08…