【数字图像处理】二值图像行程编码
前言
数字图像处理课设中要对二值图像进行压缩和解压缩,所以设计了这一部分。
Tip:此代码只适用于图像中有大面积相同色块,否则压缩效果欠佳。
一、代码部分
1. 二值图像压缩
代码如下:
import numpy as np
def BRLE(img):
img=np.array(img)
img_f=img.flatten() # 图像数组扁平化
BRLE_seq=[] # 输出序列
elemt=[0,1] # 序列元素种类,因为是二值图,所以元素只有0和1
flag=0 # 连续元素的值,假设第一个为0
count=0 # 连续元素个数
for i in range(len(img_f)): # 开始遍历
if img_f[i]==flag:
count+=1
if i==len(img_f)-1: # 遍历到最后一个元素
if flag == 0:
BRLE_seq.append(-1 * count)
elif flag == 1:
BRLE_seq.append(count)
else:
if count>=1:
if flag==0:
BRLE_seq.append(-1*count)
elif flag==1:
BRLE_seq.append(count)
count=1
temp=list(elemt.copy()) # 不更改elemt的值
temp.remove(flag) # 元素不同,更换flag
flag=temp[0]
if i==len(img_f)-1: # 与上面相同,遍历到最后一个元素,避免bug
if flag == 0:
BRLE_seq.append(-1 * count)
elif flag == 1:
BRLE_seq.append(count)
return BRLE_seq # 输出的是列表,不是二维数组
2. 二值图像解压缩
代码如下:
import numpy as np
def IBRLE(seq,rows,cols): # 这里要输入压缩后的序列(就是列表)以及源图像的尺寸
ORG_seq=[] # 结果列表
for i in range(len(seq)):
if seq[i]>0:
for m in range(seq[i]):
ORG_seq.append(1)
else:
for n in range(np.abs(seq[i])): # seq[i]小于0,循环时要取绝对值
ORG_seq.append(0)
return np.array(ORG_seq).reshape(rows,cols)
二、运行部分
原二值图如下:
压缩后的序列如下:
[-1277, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55, -19, 55]
解压缩: