用matlab 对图像进行算术编码和解码的程序!!!求大神指点

用matlab 对图像进行算术编码和解码的程序!!!求大神指点,第1张

close allclear allclc %关闭所有图形窗口,清除工作空间所有变量,清空命令行

I=imread('lena.bmp')%待编码的矩阵

imshow(I)

thresh = graythresh(I)%自动确定二值化阈值

I2 = im2bw(I,thresh) %对图像二值化

imshow(I2)

[m,n]=size(I2) %计算矩阵大小

I2=double(I2)

p_table=tabulate(I2(:))%统计矩阵中元素出现的概率,第一列为矩阵元素,第二列为个数,第三列为概率百分数

color=p_table(:,1)'

p=p_table(:,3)'/100 %转换成小数表示的概率

psum=cumsum(p_table(:,3)')%计算数组各行的累加值

allLow=[0,psum(1:end-1)/100]%由于矩阵中元素只有两种,将[0,1)区间划分为两个区域allLow和 allHigh

allHigh=psum/100

numberlow=0 %定义算术编码的上下限numberlow和numberhigh

numberhigh=1

for k=1:m %以下计算算术编码的上下限,即编码结果

for kk=1:n

data=I2(k,kk)

low=allLow(data==color)

high=allHigh(data==color)

range=numberhigh-numberlow

tmp=numberlow

numberlow=tmp+range*low

numberhigh=tmp+range*high

end

end

fprintf('算术编码范围下限为%16.15f\n\n',numberlow)

fprintf('算术编码范围上限为%16.15f\n\n',numberhigh)

Mat=zeros(m,n) %解码

for k=1:m

for kk=1:n

temp=numberlow<low

temp=[temp 1]

indiff=diff(temp)

indiff=logical(indiff)

Mat(k,kk)=color(indiff)

low=low(indiff)

high=allHigh(indiff)

range=high - low

numberlow=numberlow-low

numberlow=numberlow/range

end

end

给你一段程序,自己研究下吧!

clc

clear

close all

%定义HufData/Len为全局变量的结构体

global HufData

global Len

disp('计算机正在准备输出哈夫曼编码结果,请耐心等待……')

%原始码字的灰度

a=imread('kids.tif')

%分区画出原始图像和灰度直方图

figure

subplot(1,2,1)

imshow(a)

%取消坐标轴和边框

axis off

box off

title('MATLAB自带图像','fontsize',13)

subplot(1,2,2)

axis off

box off

imhist(a)

title('图像灰度直方图','fontsize',13)

%图像的灰度统计

GrayStatistics=imhist(a)

GrayStatistics=GrayStatistics'

GrayRatioo=GrayStatistics/sum(GrayStatistics)

GrayRatioNO=find(GrayRatioo~=0)

Len=length(GrayRatioNO)

%初始化灰度集,防止系统随即赋予其垃圾值

GrayRatio=ones(1,Len)

for i=1:Len

GrayRatio(i)=GrayRatioo(i)

end

GrayRatio=abs(sort(-GrayRatio))

%将图像灰度概率赋予结构体

for i=1:Len

HufData(i).value=GrayRatio(i)

end

% 哈夫曼编码/霍夫曼编码

HuffmanCode(Len)

%输出码字

zippedHuffman=1

for i=1:Len

tmpData=HufData(i).code

str=''

for j=1:length(tmpData)

str=strcat(str,num2str(tmpData(j)))

zippedHuffman=zippedHuffman+1

end

disp(strcat('a',num2str(i),'= ',str))

end

i

%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码

zippedHuffman

%计算在删去0灰度级压缩之前的原始图像字节容量

unzipped_delete=i*8

%计算压缩比率

ratio_delete=zippedHuffman/unzipped_delete

%计算图像的压缩比率

ad=num2str(ratio_delete*100)

str2=strcat(ad,'%')

disp(strcat('哈夫曼编码压缩比率','= ',str2))

%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCode.m

function HuffmanCode(OriginSize)

global HufData

global Len

for i=1:Len

%%霍夫曼编码树左边纪录为1

HufData(i).left=1

%%霍夫曼编码树右边纪录为0

HufData(i).right=0

%%输出码初始化为0

HufData(i).code=[]

%%排序列表初始化

SortList(i).symbol=i

SortList(i).value=HufData(i).value

end

%初始化原始消息数目

newsymbol=OriginSize

for n=OriginSize:-1:2

%将N个消息进行排序

SortList=sortdata(SortList,n)

%将最后两个出现概率最小的消息合成一个消息

newsymbol=newsymbol+1

HufData(newsymbol).value=SortList(n-1).value+SortList(n).value

HufData(newsymbol).left=SortList(n-1).symbol

HufData(newsymbol).right=SortList(n).symbol

%将消息添加到列队的最后,为N-1个消息重新排序作好准备

SortList(n-1).symbol=newsymbol

SortList(n-1).value=HufData(newsymbol).value

end

%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码

visit(newsymbol,Len,[])

end

%子程序:冒泡排序法函数sortdata.m

function reData=sortdata(SortList,n)

%根据消息概率进行排序

for k=n:-1:2

for j=1:k-1

min=SortList(j).value

sbl=SortList(j).symbol

if(min<SortList(j+1).value)

SortList(j).value=SortList(j+1).value

SortList(j+1).value=min

SortList(j).symbol=SortList(j+1).symbol

SortList(j+1).symbol=sbl

end

end

end

reData=SortList

end

%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visit.m

function visit(node,n,ocode)

global HufData

if node<=n

%如果没有哈夫曼编码/霍夫曼编码树的子接点直接输出原始码,这里为空码([])

HufData(node).code=ocode

else

if(HufData(node).left>0)

%遍历左分支接点输出1,这里采用子函数嵌套调用

ocode1=[ocode 1]

visit(HufData(node).left,n,ocode1)

end

if(HufData(node).right>0)

%遍历右分支接点输出0,这里采用子函数嵌套调用

ocode2=[ocode 0]

visit(HufData(node).right,n,ocode2)

end

end

end

1)数字图像的变换:普通傅里叶变换(ft)与逆变换(ift)、快速傅里叶变换(fft)与逆变换(ifft)、离散余弦变换(DCT),小波变换。

2) 数字图像直方图的统计及绘制等;

clc

Y=imread('C:\zhengzhi.jpg')

length(size(Y))==3

s=rgb2gray(Y)

imshow(Y)

title('原图')%figure1

Y=rgb2gray(Y)

figureimshow(Y)title('原始图像')% figue2

[J,T] = histeq(Y)

figureimshow(J)title('增强图像')% figue3

figure imhist(Y,64)title('原始图像直方图')% figue4

figure imhist(J,64)title('均衡化图像直方图')% figue5

clear all

Y=imread('C:\zhengzhi.jpg')%导入图片%傅里叶变换

Y=rgb2gray(Y)

figure(1)

imshow(Y)

title('灰度化后的图像')

Y1=fftshift(fft2(Y))

figure(2)

Y2=abs(Y1)

imshow(Y2,[])

title('傅里叶变换的图像')

figure(3)

Y2=abs(ifft2(Y1))/255

imshow(Y2)

title('傅里叶逆变换的图像')

J=fft2(double(s))%快速傅里叶变换

K=fftshift(fft2(double(s)))

F=ifft2(K)%快速傅里叶变换

figure%figure6

imshow(J)

title('FFT变换结果')

figure%figure7

imshow(log(abs(K)+1),[])

title('零点平移')

figure %figure8

imshow(abs(F),[])

title('IFFT变换结果')

% 图象的DCT变换

RGB=imread('C:\zhengzhi.jpg')

figure%figure9

subplot(1,2,1)

imshow(RGB)

title('彩色原图')

a=rgb2gray(RGB)

subplot(1,2,2)

imshow(a)

title('灰度图')

figure%figure10

b=dct2(a)

imshow(log(abs(b)),[]),colormap(jet(64)),colorbar

title('DCT变换结果')

figure%figure11

b(abs(b)<10)=0

% idct

c=idct2(b)/255

imshow(c)

title('IDCT变换结果')

小波变换

clear

I= imread('C:\zhengzhi.jpg')

X=rgb2gray(I)

subplot (121)

imshow(X)

title ('原始图像') %画出原图像

[c,s] =wavedec2 (X, 2, 'sym4')

%进行二层小波分解

len = length ( c) %处理分解系数,突出轮廓,弱化细节

for I = 1: len

if (c( I )>350)

c( I ) = 2*c (I )

else

c( I ) = 0.5*c( I )

end

end

nx =waverec2 ( c, s, 'sym4')

%分解系数重构

subplot(122)

image( nx)

title('增强图像')

%画出增强图像


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8095134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存