利用行程编码对图像进行压缩,并显示压缩比和压缩前后对比图,计算数据冗余率

        行程编码是一种简单的无损数据压缩算法,其原理是将连续重复出现的数据项用一个计数值和一个表示数据项的符号来表示,从而实现数据的压缩。

        行程编码的核心思想在于利用数据的重复性来减少数据的存储空间。当数据中存在大量连续重复出现的情况时,行程编码能够取得较好的压缩效果。然而,如果数据中没有连续重复的情况,行程编码的效率会较低,甚至可能导致压缩后的数据比原始数据还要大。

        下面我举一个简单的例子:

假设原始数据为:AAAABBBCCDAA

通过行程编码,可以将其表示为:4A3B2C1D2A

        在这个示例中,连续的A有4个,连续的B有3个,连续的C有2个,连续的D有1个,连续 的A有2个。这样就用了数字表示了原来重复的部分,实现了对数据的压缩。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

## 彩色图像灰度化
image = cv.imread('picture3.jpg', 1)
grayimg = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
rows, cols = grayimg.shape

image1 = grayimg.flatten()  # 把灰度化后的二维图像降维为一维列表
# print(len(image1))

# 二值化操作
for i in range(len(image1)):
    if image1[i] >= 127:
        image1[i] = 255
    if image1[i] < 127:
        image1[i] = 0

data = []
image3 = []
count = 1
# 行程压缩编码
for i in range(len(image1) - 1):
    if (count == 1):
        image3.append(image1[i])
    if image1[i] == image1[i + 1]:
        count = count + 1
        if i == len(image1) - 2:
            image3.append(image1[i])
            data.append(count)
    else:
        data.append(count)
        count = 1

if (image1[len(image1) - 1] != image1[-1]):
    image3.append(image1[len(image1) - 1])
    data.append(1)

# 压缩率
ys_rate = len(image3) / len(image1) * 100
print('压缩率为' + str(ys_rate) + '%')

# 计算数据冗余率
original_data_size = rows * cols
compressed_data_size = len(image3)
redundancy_rate = (original_data_size - compressed_data_size) / original_data_size * 100
print('数据冗余率为' + str(redundancy_rate) + '%')

# 行程编码解码
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))

# cv.imwrite('image/output.jpg', rec_image)
cv.imwrite('image/output_fruit.jpg', rec_image)

# 显示原始图像和重建图像
plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.imshow(cv.cvtColor(image, cv.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(rec_image, cmap='gray')
plt.title('Decoded Image')
plt.axis('off')

plt.show()

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值