图像统计编码演示程序的设计_毕业设计论文(编辑修改稿)内容摘要:
4)在合并运算时,概率大的符号用编码 0 表示,概率小的符号用编码 1 表示。 5)记录下概率为 1 处到当前信号源符号之间的 0, l 序 列,从而得到每个符号的编码。 ②算术编码中: 主程序调用 arithencode 函数对 symbol进行算术编码; 再调用 arithdecode 对算术编码进行解码。 算术编码不是将单个信源符号映射成一个码字,而是把整个信源表示为实数线上的 0 到 1 之间的一个区间,其长度等于该序列的概率。 再在该区间选择一个代表性的小数,转化成二进制作为实际的编码输出。 消息序列中的每个元素 第 6 页 共 19 页 都要缩短为一个区间。 消息序列中元素越多,所得到的区间就越小。 当区间变小时,就需要更多的数位来表示这个区间。 采用算术编码,每个符号的平均编码长度可以为小数。 系统方框图 ① Huffman 编码: ②算术编码: 开始 加载图像 将图像转换成无符号的 8 位整数 调用 Huffman 编码程 序进行压缩 调用 Huffman 解码程 序进行解码 结束 子程序:函数调用 显示图像,原始图像和经编码解码后的图像显示压缩比 第 7 页 共 19 页 各功能模块的主要实现程序 用 Matlab程序实现 Huffman 编码 clear X = imread(39。 39。 )。 %从 MAT 文件下载到工作空间 data = uint8(X)。 %将该图 片定义为无符号 8 为整数 [zipped, info] =huffencode(data)。 %调用 Huffman 编码程序进行压缩 unzipped = huffdecode(zipped, info)。 %调用 Huffman 解码程序进行解码 subplot(121)。 imshow(data)。 %显示原图像 subplot(122)。 imshow(unzipped)。 %显示经编码、解码后的图像 erms = pare(data( :),unzipped( :)) %计算两幅图,得均方根误差 cr = whos data unzipped zipped function [zipped, info] = huffencode(vector) %函数声明, huffencode 对输入矩阵 vector 进行Huffman 编码 %输入和输出都是 uint8 格式 if~isa(vector, 39。 uint839。 ) %若矩阵 vector 是给定类时,为真 error(39。 input argument must be a uint8 vector39。 )。 %跳出函数并显示信息 end [m ,n] = size(vector)。 %检查矩阵的阶数 vector = vector( :)39。 %将矩阵按列排列 f = frequency(vector)。 %计算各符号出现的概率 symbols = find(f~=0)。 %查找概率不为零符号的下标 f = f(symbols)。 第 8 页 共 19 页 [f, sortindex] = sort(f)。 %将符号按照出现的概率大小排列 symbols = symbols(sortindex)。 len = length(symbols)。 %求矩阵的长度 symbols_index = num2cell(1: len)。 %把数字数组变换为单元阵列 codeword_tmp = cell(len, 1)。 while length(f)1 %生成 Huffman 树,得到码字编码表 index1 = symbols_index{1}。 index2 = symbols_index{2}。 codeword_tmp(index1) = addnode(codeword_tmp(index1), uint8(0))。 codeword_tmp(index2) = addnode(codeword_tmp(index2), uint8(1))。 f = [sum(f(1:2)) f(3: end)]。 symbols_index = [{[index1,index2]} symbols_index(3:end)]。 [f, sortindex] = sort(f)。 %将各符号的概率列向重新排列 symbols_index = symbols_index(sortindex)。 end codeword = cell(256,1)。 %建立单元阵列 codeword(symbols) = codeword_tmp。 len = 0。 for index = 1:length(vector) %得到整个图像所有比特数 len = len + length(codeword{double(vector(index)) +1})。 end string = repmat(uint8(0),1,len)。 pointer = 1。 for index = 1:length(vector) %对输入图像所有比特数 code = codeword{double(vector(index)) +1}。 len = length(code)。 string(pointer+(0:len1)) = code。 pointer = pointer + len。 end len = length(string)。 pad = 8mod(len, 8)。 %非 8 整数倍时,最后补 pad 个零 if pad0 string = [string uint8(zeros(1,pad))]。 end codeword = codeword(symbols)。 codelen = zeros(size(codeword))。 weights = 2.^(0:23)。 maxcodelen = 0。 for index = 1:length(codeword) len = length(codeword{index})。 if lenmaxcodelen maxcodelen = len。 end if len0 code = sum(weights(codeword{index} ==1))。 code = bitset(code,len+1)。 codeword{index} = code。 codelen(index) = len。 end 第 9 页 共 19 页 end codeword = [codeword{:}]。 %计算压缩后的向量 cols = length(string)/8。 %将字符串的长度除以 8,得到列数 string = reshape(string,8,cols)。 %对这个字符串阶数重组, 8 行, cols 列 weights = 2.^(0:7)。 zipped = uint8(weights*doub。图像统计编码演示程序的设计_毕业设计论文(编辑修改稿)
相关推荐
PSNR=10lg 10102^2m a x)],(),([MNMiNjjiajiaa ( 26) 要是信息是视频或者用于商业图片的话,常用 K=8,直接将 amax =256代入到上式。 图像质量评价的主观准则 主观准则也常常被用于图像的评价当中去。 由于每个人的审美还有观感不一样,所以就利用多数人的态度,让很多人去看同一张图片,让其打分。 如表
较 强的噪声抑制能力;同样该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算 7 法检测和连接边缘,边缘的连续性较好。 8 三、 详细设计过程 Roberts 算子、 Sobel 算子、 Prewitt 算子的检测效果相差不大,三种算子的检测效果较之 Canny 和 Log 算子还是存在一定的差距。 这三种检测算子的阈值选择范围与 log 和 canny 算子相比要小些。
xD 1 0 1 2 0 2 1 0 1yD (式 3) 下面以一个简单的例子来体会该算法。 设原图像为 3 3 3 3 33 8 7 6 33 6 0 5 33 7 8 4 33 8 3 3 3f 对 f 中模板罩不住的地方其处理结果令为 0,其它的像素一次按照式(式 1) 6 进行计算。 例如,对 (2,2),3 3f
奇异变化的地方。 奇异信号沿边缘走向的灰度变化剧烈,通常我们将边缘划分为阶跃状和屋顶状两种类型 (如图 12 所示 )。 阶跃边缘中两边的灰度值有明显的变化;而屋顶状边缘位于灰度增加与减少的交界处。 在数学上可利用灰度的导数来刻画边缘点的变化,对阶跃边缘、屋顶状边缘分别求其一阶、二阶导数。 其中阶跃型边缘最具代表性,许多边缘检测算法都是针对阶跃型边缘的。 图 12
5 从式 (211)可以看出,系统 H 的输出就等于输入信号及其冲激响应进行卷积积分所得到的结果。 当受到加性噪声干扰时,式 (211)的线性退化模型就变为: ( x , y ) ( , ) ( x , y ) d d n ( x , y )( x , y ) h ( x , y ) n ( x , y )g f hf
缘连接:从无序边缘表形成有序边缘表的过程。 习惯上边缘的表示采用顺时针方向来排序。 边缘跟踪:一个用来确定轮廓图像(指滤波后的图像)的搜索过程。 边缘点的坐标可以是 边缘位置像素点的行、列整数标号,也可以在子像素分辨率水平上表示。 边缘坐标可以在原始图像坐标系上表示,但大多数情况下是在边缘检测滤波器的是输出图像的坐标系上表示,因为滤波过程可能导致图像坐标平移或者缩放。