range-coder使用

本文探讨了Range编码器的使用方法,强调在编码前需要了解数据的累计概率分布。通过自定义概率频率统计和归一化处理,生成累计概率密度,并展示了仅能编码0,1,2三个数的实例。为了改变编码区间,可调整累计概率密度函数。" 105082445,9408624,Sentinel-2遥感数据的大气校正实践,"['遥感技术', 'GIS应用', '遥感图像处理', '数据校正', '空间信息']
摘要由CSDN通过智能技术生成

Range coder的原理

Range coder的原理部分可以参考熵编码算法Range encoding工程原理和实现
比特流原理参考Range Coder编码比特流
本篇文章谈一谈range-coder的使用问题
代码参考

根据range coder的原理,我们在编码前需要提前知道编码数据的累计概率分布

from range_coder import RangeEncoder, RangeDecoder
from range_coder import prob_to_cum_freq, cum_freq_to_prob
prob = [4, 6, 8]
prob = np.asarray(prob, dtype=np.float64) / np.sum(prob)
cumFreq = prob_to_cum_freq(prob, 128)
cumFreq[-1] = 2
将这段代码改写成python#include <iostream> #include "string.h" using namespace std; #define N 4 struct node { char c; double probablity; node* next; }; //输入节点的符号以及出现频率 node* Input() { node* p,*head; double pro = 0.0; //a head = new node; head->c = 'a'; head->probablity = 0.1; p = new node; //b head->next = p; p->c = 'b'; p->probablity = 0.4; p->next = new node; //c p = p->next; p->next = p; p->c = 'c'; p->probablity = 0.2; p->next = new node; //d p = p->next; p->next = p; p->c = 'd'; p->probablity = 0.3; p->next = NULL; /* head->c = 'a'; cin >> pro; head->probablity = pro; p = new node; head->next=p; for (int i = 1; i < N; i++) { p->c = 'a' + i; cin>>pro; p->probablity = pro ; //cout <<i<< p->c << '\t' << p->probablity<<endl; p->next = new node; p = p->next; } cout << endl; p->next = NULL; */ //打印链表 p = head; /*for (int i = 0; p != NULL; i++) { cout << p->c << '\t' << p->probablity << endl; p = p->next; }*/ return head; } //编码 double encoding(node* head) { node* p; p = new node; p = head; double low = 0.0, high = 1.0; double range; double range_high_low[2][N]; double prob = 0.0; //各字符范围 for (int i = 0; i < N; i++) { range_high_low[0][i] = prob; range_high_low[1][i] = p->probablity + prob; prob = range_high_low[1][i]; p = p->next; //cout << range_high_low[0][i] << '\t' << range_high_low[1][i] << endl; } //输入压缩信息a~d //注:double精度会缺失; char ch[] = {"cadacdb"}; //找到对应的概率值 for (int j = 0; j < 9; j++) { p = head; for (int i = 0; p!=NULL; i++) { if ((int(ch[j])-int(p->c))==0) { cout << p->c << '\t'; int n = ch[j] - 'a'; //编码 range = high - low; high = low + range * range_high_low[1][n]; low = low + range * range_high_low[0][n]; cout << low << '\t' << high << endl; } p = p->next; } } return low; } int main() { node* head,*p; head = Input(); p = head; double coder=encoding(p); cout << coder; return 0; }
06-03
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值