使用Python对图像进行不同级别量化QP,使用RLE计算压缩比,并计算对应的PSNR

news/2024/9/22 9:35:52

写这篇博客源于 博友的提问:
在这里插入图片描述

1.效果图

原图 VS QP=2 VS QP=4 VS QP=8效果图如下:
QP量化是指把原始图像按像素级别划分取值。如QP=2,则<128 取0,>128取128.
QP=4,则<64取0,<128取64,<192取128,<256取192.
QP=8,则<32取0,<64取32,<96取64,<128取96,<160取128,<192取160,<224取192,<256取224.
在这里插入图片描述

可以看出QP越大,压缩率越大,同时psnr越大,这表示跟原图相似性越好,越接近原图像。
PSNR 最小值为 0,PSNR 越大,两张图像差异越小;PSNR 计算简单,物理意义清晰,但是这种基于 MSE 的评价指标并不能很好的按人眼的感受来衡量两张图像的相似度
在这里插入图片描述
原始灰度图像 VS 原始图像rle后再反解码回去效果图如下:
在这里插入图片描述
原始灰度图像 VS qp=2图像rle后再反解码回去效果图如下:
在这里插入图片描述

原始灰度图像 VS qp=4图像rle后再反解码回去效果图如下:
在这里插入图片描述
原始灰度图像 VS qp=8图像rle后再反解码回去效果图如下:
在这里插入图片描述

2. 原理

  • 量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量。
    QP量化是指把原始图像按像素级别划分取值。如QP=2,则<128 取0,>128取128.
    QP=4,则<64取0,<128取64,<192取128,<256取192.
    QP=8,则<32取0,<64取32,<96取64,<128取96,<160取128,<192取160,<224取192,<256取224.

  • 行程编码(RLE) 在图像压缩上,行程编码一般用于压缩二值化图像,因为它是基于重复的压缩算法,比如:
    二维图像降维后(压缩前):0 0 0 0 0 255 255 255 0 0 255
    行程编码压缩后:5 0 3 255 2 0 1 255
    (压缩格式为:数量+像素+数量+像素…)
    如果有大量的像素连续重复,那么压缩率会更高。

  • PSNR(峰值信噪比,Peak Signal-to-Noise Ratio),用于衡量两张图像之间差异,例如压缩图像与原始图像,评估压缩图像质量;复原图像与ground truth,评估复原算法性能等。
    在这里插入图片描述

    PSNR 最小值为 0,PSNR 越大,两张图像差异越小;
    PSNR 计算简单,物理意义清晰,但是这种基于 MSE 的评价指标并不能很好的按人眼的感受来衡量两张图像的相似度

3. 源码

# -*- coding: utf-8 -*-
# By:Eastmount
# 1. 对图像进行 QP=2,QP=4,QP=8的量化并展示
# 2. 采用行程编码(RLE),计算压缩比;
# 3. 进行解码(反量化),并计算不同量化级别的PSNR值。
# python ask_img_qa_rle_psnr.py
import cv2
import math
import matplotlib.pyplot as plt
import numpy as np# 读取原始图像
img = cv2.imread('ml.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]# 创建一幅图像
new_img1 = np.zeros((height, width, 3), np.uint8)
new_img2 = np.zeros((height, width, 3), np.uint8)
new_img3 = np.zeros((height, width, 3), np.uint8)# 图像量化等级为2的量化处理
for i in range(height):for j in range(width):for k in range(3):  # 对应BGR三分量if img[i, j][k] < 128:gray = 0else:gray = 128new_img1[i, j][k] = np.uint8(gray)# 图像量化等级为4的量化处理
for i in range(height):for j in range(width):for k in range(3):  # 对应BGR三分量if img[i, j][k] < 64:gray = 0elif img[i, j][k] < 128:gray = 64elif img[i, j][k] < 192:gray = 128else:gray = 192new_img2[i, j][k] = np.uint8(gray)# 图像量化等级为8的量化处理
for i in range(height):for j in range(width):for k in range(3):  # 对应BGR三分量if img[i, j][k] < 32:gray = 0elif img[i, j][k] < 64:gray = 32elif img[i, j][k] < 96:gray = 64elif img[i, j][k] < 128:gray = 96elif img[i, j][k] < 160:gray = 128elif img[i, j][k] < 192:gray = 160elif img[i, j][k] < 224:gray = 192else:gray = 224new_img3[i, j][k] = np.uint8(gray)# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']# 显示图像
titles = ['(a) 原始图像', '(b) 量化-QP=2', '(c) 量化-QP=4', '(d) 量化-QP=8']
images = [img, new_img1, new_img2, new_img3]
for i in range(4):plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray'),plt.title(titles[i])plt.xticks([]), plt.yticks([])
plt.show()# 2. RLE计算压缩比
def rle(title, origin, img):grayorigin = cv2.cvtColor(origin, cv2.COLOR_RGB2GRAY)grayimg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)rows, cols = grayimg.shapeimg = grayimg.flatten()  # 把灰度化后的二维图像降维为一维列表data = []image3 = []count = 1# 行程压缩编码for i in range(len(img) - 1):if (count == 1):image3.append(img[i])if img[i] == img[i + 1]:count = count + 1if i == len(img) - 2:image3.append(img[i])data.append(count)else:data.append(count)count = 1if (img[len(img) - 1] != img[-1]):image3.append(img[len(img) - 1])data.append(1)# 压缩率ys_rate = len(image3) / len(img) * 100print(str(title) + ' 压缩率: %.2f%s' % (ys_rate, '%'))# 行程编码RLE解码rec_image = []for i in range(len(data)):for j in range(data[i]):rec_image.append(image3[i])rec_image = np.reshape(rec_image, (rows, cols))cv2.imshow('grayorigin VS ' + str(title) + 'res', np.hstack([grayorigin, rec_image]))  # 重新输出二值化图像cv2.waitKey(0)plt.subplot()plt.imshow(np.hstack([grayorigin, rec_image]), 'gray')plt.title('grayOrigin VS ' + str(title) + '')plt.xticks([]), plt.yticks([])plt.show()print(str(title) + ' psnr: ', psnr2(grayorigin, rec_image))# 3. 计算psnr
# 计算灰度图的psnr
def psnr1(img1, img2):# compute mse# mse = np.mean((img1-img2)**2)mse = np.mean((img1 / 1.0 - img2 / 1.0) ** 2)# compute psnrif mse < 1e-10:return 100psnr1 = 20 * math.log10(255 / math.sqrt(mse))return psnr1# 计算彩色图的psnr
def psnr2(img1, img2):mse = np.mean((img1 / 255.0 - img2 / 255.0) ** 2)if mse < 1e-10:return 100psnr2 = 20 * math.log10(1 / math.sqrt(mse))return psnr2for i in range(0, 4):rle(titles[i], images[0], images[i])

参考

  • 对图像进行qp量化
  • https://blog.csdn.net/qq_42233962/article/details/105482765
  • psnr计算
  • https://blog.csdn.net/weixin_43605641/article/details/118088814

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

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

相关文章

使用Python,SMTP发邮件到qq邮箱(文本/超链接/图片/表格/附件表格)

使用Python&#xff0c;SMTP发邮件到qq邮箱&#xff08;文本/超链接/图片/表格/附件表格&#xff09; 这篇博客将介绍如何利用SMTP&#xff0c;使用Python向qq邮箱自动发邮件&#xff0c;包括正文文本超链接图片表格&#xff0c;附件图片表格&#xff0c;收件人可多个&#xf…

图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像

图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像 这篇博客将介绍如何从头到尾创建图像搜索引擎。第一步是选择一个图像描述符——使用3D RGB直方图来表征图像的颜色。然后通过提取特征向量(即直方图)使用描述符对数据集中的每个图像进行索引。然后使用卡…

读书笔记3|使用Python,networkx对卡勒德胡赛尼三部曲之——《群山回唱》人物关系图谱绘制

读书笔记3|《群山回唱》-卡勒德胡赛尼 踉跄前行中&#xff0c;你总能在他们身上找到丢失的那一部分记忆。 一度看不下去这本书&#xff0c;因为最开始的章节里太痛了&#xff0c;加上我也离开我的孩子&#xff0c;生活已经够苦&#xff0c;我需要一点糖。这次实在太无聊了&…

使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角

使用Python&#xff0c;Open3D对点云散点投影到面上并可视化&#xff0c;使用3种方法计算面的法向量及与平均法向量的夹角 写这篇博客源于博友的提问&#xff0c;他坚定了我继续坚持学习的心&#xff0c;带给了我充实与快乐。 将介绍以下5部分&#xff1a; 随机生成点云点投影…

DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)

学习根柢根底观观点操作游标游标措置概述在本节中&#xff0c;您将更进一步看到若安在嵌入式 SQL 使用次第中运用游标。异常&#xff0c;根柢根底的步骤照旧是声明、翻开、获取、更新/删除&#xff08;可选&#xff09;和封闭。为了赞助看法游标的观观点&#xff0c;假定 DB2 构…

计算机视觉|针孔成像,相机内外参及相机标定,矫正的重要性

计算机视觉读书笔记|相机内外参及相机标定&#xff0c;矫正的重要性 这篇博客将介绍针孔成像&#xff0c;透镜&#xff08;弥补了针孔成像曝光不足成像速度慢的缺点&#xff0c;但引进了畸变&#xff0c;主要是径向畸变和切向畸变&#xff0c;径向畸变主要是离中心越远越弯曲&…

计算机视觉|投影与三维视觉

这一篇将学习投影与三维视觉&#xff0c;沿用上一篇 计算机视觉|针孔成像&#xff0c;相机内外参及相机标定&#xff0c;矫正的重要性 摄像机内参数矩阵M、畸变参数、旋转矩阵R、平移向量T以及但影响矩阵H。回顾放射和投影变换&#xff0c;并使用POSIT算法从一幅图像中查找获得…

3. 使用PyTorch深度学习库训练第一个卷积神经网络CNN

这篇博客将介绍如何使用PyTorch深度学习库训练第一个卷积神经网络&#xff08;CNN&#xff09;。训练CNN使用 KMNIST 数据集&#xff08;MNIST digits数据集的替代品&#xff0c;内置在PyTorch中&#xff09;识别手写平假名字符&#xff08;handwritten Hiragana characters&am…