给你一段程序,自己研究下吧!\x0d\\x0d\clc\x0d\clear\x0d\closeall;\x0d\%定义HufData/Len为全局变量的结构体\x0d\globalHufData;\x0d\globalLen\x0d\disp('计算机正在准备输出哈夫曼编码结果,请耐心等待');\x0d\%原始码字的灰度\x0d\a=imread('kidstif');\x0d\\x0d\%分区画出原始图像和灰度直方图\x0d\figure;\x0d\subplot(1,2,1)\x0d\imshow(a);\x0d\%取消坐标轴和边框\x0d\axisoff\x0d\boxoff\x0d\title('MATLAB自带图像','fontsize',13);\x0d\subplot(1,2,2);\x0d\axisoff\x0d\boxoff\x0d\imhist(a);\x0d\title('图像灰度直方图','fontsize',13);\x0d\%图像的灰度统计\x0d\GrayStatistics=imhist(a);\x0d\GrayStatistics=GrayStatistics';\x0d\GrayRatioo=GrayStatistics/sum(GrayStatistics);\x0d\GrayRatioNO=find(GrayRatioo~=0);\x0d\Len=length(GrayRatioNO);\x0d\%初始化灰度集,防止系统随即赋予其垃圾值\x0d\GrayRatio=ones(1,Len);\x0d\\x0d\fori=1:Len\x0d\GrayRatio(i)=GrayRatioo(i);\x0d\end\x0d\\x0d\GrayRatio=abs(sort(-GrayRatio));\x0d\%将图像灰度概率赋予结构体\x0d\fori=1:Len\x0d\HufData(i)value=GrayRatio(i);\x0d\end\x0d\\x0d\%哈夫曼编码/霍夫曼编码\x0d\HuffmanCode(Len);\x0d\%输出码字\x0d\\x0d\zippedHuffman=1;\x0d\fori=1:Len\x0d\tmpData=HufData(i)code;\x0d\str='';\x0d\forj=1:length(tmpData)\x0d\str=strcat(str,num2str(tmpData(j)));\x0d\zippedHuffman=zippedHuffman+1;\x0d\end\x0d\disp(strcat('a',num2str(i),'=',str))\x0d\end\x0d\i;\x0d\%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码\x0d\zippedHuffman;\x0d\%计算在删去0灰度级压缩之前的原始图像字节容量\x0d\unzipped_delete=i8;\x0d\\x0d\%计算压缩比率\x0d\ratio_delete=zippedHuffman/unzipped_delete;\x0d\\x0d\%计算图像的压缩比率\x0d\ad=num2str(ratio_delete100);\x0d\str2=strcat(ad,'%');\x0d\disp(strcat('哈夫曼编码压缩比率','=',str2))\x0d\\x0d\%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCodem\x0d\functionHuffmanCode(OriginSize)\x0d\globalHufData;\x0d\globalLen\x0d\fori=1:Len\x0d\%%霍夫曼编码树左边纪录为1\x0d\HufData(i)left=1;\x0d\%%霍夫曼编码树右边纪录为0\x0d\HufData(i)right=0;\x0d\%%输出码初始化为0\x0d\HufData(i)code=[];\x0d\%%排序列表初始化\x0d\SortList(i)symbol=i;\x0d\SortList(i)value=HufData(i)value;\x0d\end\x0d\%初始化原始消息数目\x0d\newsymbol=OriginSize;\x0d\forn=OriginSize:-1:2\x0d\%将N个消息进行排序\x0d\SortList=sortdata(SortList,n);\x0d\%将最后两个出现概率最小的消息合成一个消息\x0d\newsymbol=newsymbol+1;\x0d\HufData(newsymbol)value=SortList(n-1)value+SortList(n)value;\x0d\HufData(newsymbol)left=SortList(n-1)symbol;\x0d\HufData(newsymbol)right=SortList(n)symbol;\x0d\%将消息添加到列队的最后,为N-1个消息重新排序作好准备\x0d\SortList(n-1)symbol=newsymbol;\x0d\SortList(n-1)value=HufData(newsymbol)value;\x0d\end\x0d\%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码\x0d\visit(newsymbol,Len,[]);\x0d\end\x0d\\x0d\%子程序:冒泡排序法函数sortdatam\x0d\functionreData=sortdata(SortList,n)\x0d\%根据消息概率进行排序\x0d\fork=n:-1:2\x0d\forj=1:k-1\x0d\min=SortList(j)value;\x0d\sbl=SortList(j)symbol;\x0d\if(min<SortList(j+1)value)\x0d\SortList(j)value=SortList(j+1)value;\x0d\SortList(j+1)value=min;\x0d\SortList(j)symbol=SortList(j+1)symbol;\x0d\SortList(j+1)symbol=sbl;\x0d\end\x0d\end\x0d\end\x0d\reData=SortList;\x0d\end\x0d\\x0d\%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visitm\x0d\functionvisit(node,n,ocode)\x0d\globalHufData\x0d\ifnode0)\x0d\%遍历左分支接点输出1,这里采用子函数嵌套调用\x0d\ocode1=[ocode1];\x0d\visit(HufData(node)left,n,ocode1);\x0d\end\x0d\if(HufData(node)right>0)\x0d\%遍历右分支接点输出0,这里采用子函数嵌套调用\x0d\ocode2=[ocode0];\x0d\visit(HufData(node)right,n,ocode2);\x0d\end\x0d\end\x0d\end
根据图像处理的原则,信息是逐渐丢失的,所以只有灰度图是不能复原成原来的彩色图的。
其数学原理如下:
原来一个彩色点rgb为 [1,2,3] 我们把它平均化后得到 一个灰的点 [2,2,2], 但是只根据这个灰度点是不能计算出原来的彩色点的具体信息的。
可以通过一定的规则(限制条件)对这三个数值进行运算得到彩色的图像,但得到的图像和原图是必然有差别的,比如photoshop中的单色映照什么的。
你可以用下面的代码试试
a=imread('1jpg');
R=a(:,:,1);
G=a(:,:,2);
B=a(:,:,3);
gray1=uint8((double(R)+double(G)+double(B))/3); % 均值法
figure, imshow(gray1)
gray2=max(a,[],3); % 最大值法,按a数组的第3维求最大值
figure, imshow(gray2)
gray3=median(a,3); % 中值法,按a数组的第3维求中值
figure, imshow(gray3)
以上就是关于对灰度图像进行霍夫曼编码,用Matlab怎么实现全部的内容,包括:对灰度图像进行霍夫曼编码,用Matlab怎么实现、用Matlab将彩色图编程灰度图以后,在变回彩色图如何处理、matlab 用平均值和最大值灰度化的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)