数字图像处理-图像压缩

news2025/1/18 5:51:12

数字图像处理-图像压缩

  • 一、图像压缩
    • 1.1 图像压缩的意义
    • 1.2 图像的冗余信息
      • 1.2.1 编码冗余
      • 1.2.2 空间冗余
      • 1.2.3 时间冗余
  • 二、一些基本的压缩方法
    • 2.1 霍夫曼编码
    • 2.2 行程编码
    • 2.3 算术编码
    • 2.4 LZW编码
  • 三、数字图像水印
    • 3.1 简单的可见水印
    • 3.2LSB不可见水印

一、图像压缩

1.1 图像压缩的意义

首先需要明确此处“图像压缩”的含义,本处提到的图像压缩是指在保证图像质量的前提下实现图像压缩。而压缩的对象是图像的存储大小。那么对图像压缩可以减少图像在传输时的带宽需求,提高网站等客户端等相应速度、提升用户体验,以及节省存储空间。

1.2 图像的冗余信息

图像之所以可以被压缩时因为它有很多冗余信息。 常见图像、视频、音频数据中存在的冗余类型有:编码冗余、空间冗余、时间冗余。

1.2.1 编码冗余

假设图像的灰度级可以用离散的随机变量表示,且每个灰度级 r k r_k rk出现的概率为 P r P_r Pr
P r ( r k ) = n k n k = 1 , 2 , 3 , … , L − 1 P_r(r_k)=\frac{n_k}{n}\quad k=1,2,3,…,L-1 Pr(rk)=nnkk=1,2,3,,L1
L L L指灰度级数, n k n_k nk是第k个灰度级在图像中出现的次数,n是图像中的像素总数。如果用于表示每个 r k r_k rk值的比特数为 l ( r k ) l(r_k) l(rk),则用于表示每个像素的平均比特数为:
L a v g = ∑ k = 0 l − 1 l ( r k ) P r ( r k ) L_{avg}=\sum_{k=0}^{l-1}l(r_k)P_r(r_k) Lavg=k=0l1l(rk)Pr(rk)
即,不同灰度级值的平均字码长度等于每个灰度级值所用的比特数和灰度级出现的概率相乘后求和。如果某种编码的平均比特数越接近熵,则编码冗余越小,当编码冗余得到减少或消除时,就实现了数据压缩。

1.2.2 空间冗余

同异物体表面上采样点点颜色之间通常存在着空间关联性,相邻区域通常具有相似的颜色和亮度,这种情况就属于空间冗余。通过编码相似的像素值或像素块可以实现对图像的压缩。

1.2.3 时间冗余

时间冗余主要发生在视频中,视频通常由一系列连续的图像组成,相邻帧之间往往包含重复或类似的内容。通过分析视频帧之间的变化以及运动情况,选择性的保留重要信息,丢弃冗余部分可以实现对视频的高效压缩。

二、一些基本的压缩方法

2.1 霍夫曼编码

霍夫曼编码(Huffman Coding)是一种编码方法。霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。步骤如下:

  • 将信源符号的概率按递减排列。
  • 把两个最小的概率相加,并继续这一步骤,始终将较高的概率分支放在右边,直到最后变成概率1。
  • 画出由概率1处到每个信源符号的路径,顺序记下沿路径的0和1,所得就是该符号的霍夫曼码字。
  • 将每对组合的左边一个指定为0,右边一个指定为1(或相反)。
    在这里插入图片描述

构建灰度值频率字典

def build_freq_dict(gray_image):
    freq_dict = defaultdict(int)
    for row in gray_image:
        for pixel in row:
            freq_dict[pixel] += 1
    return freq_dict

构建霍夫曼树

def build_huffman_tree(freq_dict):
    heap = [[weight, [symbol, ""]] for symbol, weight in freq_dict.items()]
    heapq.heapify(heap)
    
    while len(heap) > 1:
        lo = heapq.heappop(heap)
        hi = heapq.heappop(heap)
        for pair in lo[1:]:
            pair[1] = '0' + pair[1]
        for pair in hi[1:]:
            pair[1] = '1' + pair[1]
        heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
    
    return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))

对灰度值数据进行霍夫曼编码:

def huffman_encode_gray_image(gray_image):
    freq_dict = build_freq_dict(gray_image)
    huffman_tree = build_huffman_tree(freq_dict)
    encoding_dict = {symbol: code for symbol, code in huffman_tree}
    
    encoded_data = ''.join(encoding_dict[pixel] for row in gray_image for pixel in row)
    return encoded_data, encoding_dict

对霍夫曼编码的数据进行解码

def huffman_decode_gray_image(encoded_data, encoding_dict, image_shape):
    decoding_dict = {code: symbol for symbol, code in encoding_dict.items()}
    decoded_data = []
    code = ""
    
    for bit in encoded_data:
        code += bit
        if code in decoding_dict:
            symbol = decoding_dict[code]
            decoded_data.append(symbol)
            code = ""
    
    decoded_image = np.array(decoded_data, dtype=np.uint8).reshape(image_shape)
    return decoded_image

2.2 行程编码

行程编码就是为了解决前文所提到的空间冗余,也称RLE。RLE可以用于压缩一些具有大片相同颜色的图像,如黑白二值图像或颜色较为简单的图像。RLE算法的基本思想是将连续重复出现的数据序列用一个符号表示,同时记录重复的次数。RLE编码简单直观,编码/解码速度快,因此许多图形和视频文件,如.BMP .TIFF及AVI等格式文件的压缩均采用此方法。
行程编码是一种无损压缩方法,压缩比取决于图像本身特点,相同颜色图像块越大,图像块数目越少,压缩比越高。

2.3 算术编码

算术编码的基本原理是将编码的消息表示成实数0和1之间的一个间隔,消息越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。具体步骤如下:

  • 首先按照各信源信号好出现的频率,将[0, 1)这个区间分成若干段,每个信号源会有自己对应的区间;
  • 将[0, 1)这个区间设置为初始间隔;
  • 然后按照待处理的信号,一个一个信号源读入,每读入一个信号,就将该信号源在[0, 1)上的范围等比例的缩小到最新得到的间隔中。
  • 重复步骤3,直到最后信号中的信源信号全部读完为止;

算术编码通常能够达到比霍夫曼编码和行程编码更高的压缩率,尤其在对于长序列的数据和频率分布不均匀的数据时。并且在编码过程中可以根据实际的数据分布进行动态调整,因此对于不同类型的数据能够产生更好的压缩效果。但是算术编码涉及到浮点数运算和频率累积,这些操作可能需要大量的计算资源和时间。

2.4 LZW编码

LZW编码用于将输入数据中的重复序列编码为短的标记,从而实现数据的压缩。LZW编码在图像、文本、音频等领域都有广泛应用,特别是在文本压缩和图像压缩中表现出色。LZW编码的主要思想是根据输入数据的重复序列构建一个字典,然后将重复序列用较短的标记来表示。编码过程中,算法从输入数据中不断读取字符,并将其与已有字典中的序列进行比较。如果找到匹配的序列,就继续读取字符,直到找不到匹配为止,然后将匹配的序列对应的标记输出。然后将当前字符添加到字典中,以便后续的匹配。

三、数字图像水印

数字水印是将特定的数字信号嵌入数字产品中保护数字产品版权或完整性的技术。

3.1 简单的可见水印

简单可见水印由如下公式生成:
f w = ( 1 − α ) f + α w f_w=(1-\alpha)f+\alpha w fw=(1α)f+αw
α \alpha α用于控制水印的可见性,f为原图,w为水印图片,通常 α \alpha α取值为0-1之间。
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt
import numpy as np 
img = cv2.imread("img/image.jpg")# 原图
img = img[:, :, [2, 1, 0]]
img_water = cv2.imread("img/logo.png")# 添加的水印
img_water = img_water[:, :, [2, 1, 0]]

img_ = img.copy()
for x in range(img_water.shape[0]):
     for y in range(img_water.shape[1]):
         img_[500+x][700+y][0:3] = 0.3 * img_[x][y][0:3] + 0.7 * img_water[x][y][0:3]

3.2LSB不可见水印

数字图像处理中已经知晓8比特位图像的最低比特对人眼感知几乎没有影响,因此,可以将水印图像的高阶比特位插入在衬底的低阶比特位中。
f w = 4 f 4 + w 64 f_w=4\frac{f}{4}+\frac{w}{64} fw=44f+64w
将原图使用无符号整数除以4并乘以4,来置最低两个比特位为0,并用64除w,将w的两个最高比特位移到衬底的最低比特位上。

在这里插入图片描述

import cv2
import matplotlib.pyplot as plt
import numpy as np 
img = cv2.imread("img/image.jpg")# 原图
img = img[:, :, [2, 1, 0]]
img_water = cv2.imread("img/logo.png")# 添加的水印
img_water = img_water[:, :, [2, 1, 0]]

im = img.copy()
im = im // 4 * 4
for x in range(img_water.shape[0]):
    for y in range(img_water.shape[1]):
        im[x][y] += img_water[x][y] // 64

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

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

相关文章

亚马逊美国站干粉灭火器UL安全测试标准要求UL299测试报告

UL299干粉灭火器是一种常见的灭火设备,外观一般为红色罐体,装有干粉灭火剂。它主要以高速喷射干粉灭火剂来抑制火灾并起到灭火作用。该灭火器采用压力容器和喷射装置,具有紧凑结构、方便携带等特点。对于想要在亚马逊美国站上架干粉灭火器的卖…

SpingBoot整合Sa-Token框架(1)

一、文档参考:框架介绍 (sa-token.cc) 框架生态——开源项目 (sa-token.cc) 二、与SpingBoot整合 1、创建项目 在 IDE 中新建一个 SpringBoot 项目,例如:sa-token-demo-springboot(不会的同学请自行百度或者参考:Sp…

在EC2上对SELinux故障进行紧急恢复以及排查的思路及方法

概述 SELinux,全称Security-Enhanced Linux,是一个为系统提供强制访问控制机制的安全模块,安装并启用SELinux模块的操作系统会为每个进程和系统资源打上一个特殊的安全标记,称为SELinux上下文,并根据SELinux上下文信息…

高阶数据结构-----三种平衡树的实现以及原理(未完成)

TreeMap和TreeSet的底层实现原理就是红黑树 一)AVL树: 1)必须是一棵搜索树:前提是二叉树,任取一个节点,它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key,中序遍历是有序的,按照Key的大小进行排列,高度平衡的二叉…

WINGREEN 034STM4-00-200-RS 输入输出模块

WINGREEN 034STM4-00-200-RS 输入输出模块是一种工业自动化设备,通常用于各种应用领域,以实现数字输入和输出功能。这些模块可以在不同行业的自动化系统中发挥关键作用,以下是一些可能的应用领域: 制造业:WINGREEN 034…

kubeadm搭建kubernetes(k8s)

kubeadm搭建kubernetes(k8s) 一、环境准备1.所有节点,关闭防火墙规则,关闭selinux,关闭swap交换2.修改主机名3.所有节点修改hosts文件4.调整内核参数5.生效参数 二、 安装软件1.所有节点安装docker2.所有节点安装kubea…

机器学习开源工具BatteryML,一站式分析与预测电池性能

编者按:天下苦锂电池寿命久矣,时闻“开车出,推车回”,又闻“充电两小时,待机两分钟”,亦闻“气温骤降,请注意电池保暖”……随着以锂离子电池为动力源的产品,如手机、电脑、新能源汽…

基于Java+SpringBoot+Vue前后端分离人事管理系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

软路由vs传统路由器ip:选择合适的网络设备

在构建和管理网络基础设施时,选择正确的网络设备至关重要。本文将介绍软路由IP和传统路由器两种常见的网络设备,并探讨它们各自特点、优势以及应用场景,帮助读者了解并选择最适合他们需求的网络设备。 什么是软路由IP? 软路由IP是…

vscode软件中不显示文件前的图标

问题: 解决方案: 效果:

专家解读 | 电力行业关基测评安全防护新挑战

在赛宁网安主办的安全运营实践论坛上,中国电力科学研究院信通所网安室测评主管、高级测评师肖红阳以《电力行业关基测评实践和经验交流》为主题发表演讲。他强调“电力行业关键信息基础设施是国家网络安全保护工作的重中之重”,并围绕电力关基测评的背景…

仓储24代电子标签接口文档

电子标签标签注册 通过手动触发电子标签注册到系统,注册成功就可以进行功能测试。 仓储24代注册 注册成功显示rssi:-xxdB如下: 绝对值越小信号越差,一般0 ~ -75dB都可以正常通讯 查询电子标签信息接口 接口描述 查询注册到系统的电子标签的…

八、性能测试之磁盘分析

性能测试之磁盘分析 一、磁盘简介1、存储数据之前,要先进行格式化2、读写数据时,数据与磁盘间有个磁盘缓存(内存的一部分)3、磁盘:持久化的存储设备4、磁盘读写操作流5、磁盘组成6、磁盘分区7、磁盘阵列RAID&#xff0…

记录Echarts双Y轴左右刻度不一致问题

根据项目需要,echarts实现双Y轴图表。因为两边数据不同,所以会出现左右Y轴刻度不一致。 增长率暂时是0,在X轴上,懒得改了。 修改之前: 修改之后: 根据数据找出最大值,分为6份向上取整,得到的每份就是间隔。 // dataAr…

直播预告 | CAR-T疗法红海赛道如何胜出?CAR-T工艺开发及商业化新思考

直播背景 随着整个细胞治疗行业的快速发展,CGT产业链上下游不断完善,从上游原材料及设备供应商到CXO再到创新药企,各个环节的联系更加紧密,竞争与合作关系愈加凸显。细胞药物研发过程中,对生物试剂、耗材、仪器设备有…

基于springboot的图片文字识别,支持中英文识别

概述 基于springboot的图片文字识别,支持中英文识别. 页面上传图片即可转换为中文或者英文. 详细 1.需求(要做什么) 识别图片文字, 实现页面上传图片即可转换为中文或者英文. 2.理论概述 OCR,即Optical Character Recognition&#xff…

机器学习-k-近邻算法

k-近邻算法 一、k-近邻算法概述1.1 使用python导入数据1.2 从文本文件中解析数据 二、使用k-近邻算法改进约会网站的配对效果2.1 准备数据2.2 数据预处理2.3 分析数据2.4 测试算法2.5使用算法 三、手写体识别系统 一、k-近邻算法概述 k-近邻算法是一种常用的监督学习算法&…

百度智能云千帆大模型平台2.0来了!从大模型到生产力落地的怪兽级平台!!

目录 前言 最佳算力效能为企业降低门槛 最多大模型,最多数据集为企业保驾护航 企业级安全对于企业来说是硬性要求 前言 普通人或许感知不明显,但是对于企业而言,身处AI时代,是否选择投资大模型,是否拥抱人工智能…

既然有 HTTP 协议,为什么还要有 RPC

HTTP和RPC 什么是HTTP HTTP协议(Hyper Text Transfer Protocol),又叫做超文本传输协议。平时上网在浏览器上敲个网址就能访问网页,这里用到的就是HTTP协议。 什么是RPC RPC(Remote Procedure Call)&…

详解Vision Transformer中的Encoder

一.Transformer架构 左半边是Encoder,右半边是Decoder。 二.Vision Transformer Vision Transformer取了Transformer的左半边。包含 Input EmbeddingPositional Encoding多头注意力机制 Add & Norm(前馈网络)Feed Forward Add & Norm 2.1 Input Embe…