【图像压缩】基于matlab分形编码图像压缩【含Matlab源码 824期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、简介

图像压缩就是就是通过去除这些数据冗余来减少表示数据所需的比特数,去除多余数据。以数学的观点来看,这一过程实际上就是将二维像素阵列变换为一个在统计上无关联的数据集合。
图像压缩是指以较少的比特有损或无损地表示原来的像素矩阵的技术,也称图像编码。
图像数据之所以能被压缩,就是因为数据中存在着冗余。图像数据的冗余主要表现为:图像中相邻像素间的相关性引起的空间冗余;图像序列中不同帧之间存在相关性引起的时间冗余;不同彩色平面或频谱带的相关性引起的频谱冗余。

从压缩编码算法原理上可以分类为:
(1)无损压缩编码种类:哈夫曼编码、算术编码、行程编码、Lempel zev编码
(2)有损压缩编码种类:
预测编码:DPCM,运动补偿
频率域方法:正交变换编码(如DCT),子带编码
空间域方法:统计分块编码
模型方法:分形编码,模型基编码
基于重要性:滤波,子采样,比特分配,矢量量化

(3)混合编码 ?JBIG,H261,JPEG,MPEG等技术标准

⛄二、部分源代码

clear;clc
tic
A = imread(‘Lena.tiff’);%载入待编码图像
[a, b]=size(A);
blocksizeD = 16;%domain分块大小
maxblockno = 6;
blocknoD = a/blocksizeD;
blockDtotal = blocknoD^2;
% blockDtotal = 12;
D = cell(1,blockDtotal);
for t = 1:blockDtotal
D(1, t) = {divideblock(A, blocksizeD, t, a)};
end
blocksizeR = blocksizeD/2;%range块边长设置为domain块边长的一半
blocknoR = a/blocksizeR;
blockRtotal = blocknoR^2;
R = cell(1,blockRtotal);
for t = 1:blockRtotal
R(1, t) = {divideblock(A, blocksizeR, t, a)};
end
E = cell(1,blockDtotal);
for k = 1:blockDtotal
for s = 1:blocksizeR
for t = 1:blocksizeR
E{k}(s, t) = (D{k}(2s-1, 2t-1)+D{k}(2s-1, 2t)+D{k}(2s, 2t-1)+D{k}(2s, 2t))/4;
end
end
end
blockUtotal = blockDtotal*8;
U = cell(1, blockUtotal);
for k = 1:blockUtotal
switch mod(k, 8)
case 1
U{k} = E{(k+7)/8};
case 2
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{(k+6)/8}(t, blocksizeR+1-s);
end
end
case 3
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{(k+5)/8}(blocksizeR+1-t, s);
end
end
case 4
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{(k+4)/8}(blocksizeR+1-t, blocksizeR+1-s);
end
end
case 5
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{(k+3)/8}(blocksizeR-s+1, blocksizeR-t+1);
end
end
case 6
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{(k+2)/8}(s, blocksizeR-t+1);
end
end
case 7
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{(k+1)/8}(blocksizeR-s+1, t);
end
end
case 0
for t = 1:blocksizeR
for s = 1:blocksizeR
U{k}(t, s) = E{k/8}(s, t);
end
end
end
end

blockRtotalsize = blocksizeR^2;

%以下计算不同块间度量,块间度量定义为单位化某块后另一块的八种变化与其的最小度量距离
markMatrix = zeros(blockDtotal);
for k = 1:(blockDtotal-1)
for t = (k+1):blockDtotal
tempM = U{8k-7}/(sum(U{8k-7}(😃)+eps);
for s = 1:8
tempMatrix = U{8t-8+s};
tempMmultiMatrix = tempM.tempMatrix;
tempMatrixSqure = tempMatrix.tempMatrix;
sMark = (blockRtotalsize
(sum(tempMmultiMatrix(😃))-sum(tempMatrix(😃))/(blockRtotalsize
sum(tempMatrixSqure(😃)-(sum(tempMatrix(😃))^2+eps);
oMark = (1-sMark
sum(tempMatrix(😃))/blockRtotalsize;
tempHMatrix = sMark*tempMatrix+oMark-tempM;
tempHM = tempHMatrix.*tempHMatrix;
hMark(s) = sum(tempHM(😃);
end
markMatrix(k,t) = min(min(min(hMark(1),hMark(2)),min(hMark(3),hMark(4))),min(min(hMark(5),hMark(6)),min(hMark(7),hMark(8))));
end
end

[maxM,maxmark] = max(markMatrix(😃);
maxmarkx = 1+mod(maxmark-1,blockDtotal);
maxmarky = 1+fix((maxmark-1)/blockDtotal);
maxIndexMatrix(1) = maxmarkx;
maxIndexMatrix(2) = maxmarky;
for k = 3:maxblockno
maxIndexMatrix(k) = 0;
end

for p = 3:maxblockno
for k = 1:blockDtotal
judgeno = 0;
for s = 1:(p-1)
if(maxIndexMatrix(s)==k)
judgeno = judgeno | 1;
end
end
tempMaxMatrix(k) = 0;
if (judgeno == 0)
for t = 1:maxblockno
for s = 1:(p-1)
tempMaxMatrix(k) = tempMaxMatrix(k)+markMatrix(s,k)+markMatrix(k,s);
end
end
end
end
[C,I] = max(tempMaxMatrix);
maxIndexMatrix§ = I;
end
%8个索引k对应的U中的序号为8k-7
blockWtotal = maxblockno
8;
W = cell(1, blockWtotal);
for k = 1:maxblockno
W{8*k-7} = U{maxIndexMatrix(k)8-7};
W{8
k-6} = U{maxIndexMatrix(k)8-6};
W{8
k-5} = U{maxIndexMatrix(k)8-5};
W{8
k-4} = U{maxIndexMatrix(k)8-4};
W{8
k-3} = U{maxIndexMatrix(k)8-3};
W{8
k-2} = U{maxIndexMatrix(k)8-2};
W{8
k-1} = U{maxIndexMatrix(k)8-1};
W{8
k} = U{maxIndexMatrix(k)*8};
end

%R{i}为小块,D{i}为大块,U{i}为D经过变换后的小块
%对任一个R{i},与每个U{i}进行匹配计算,选取获得最小H的压缩比和常数项,定义Radd为其中第i个元素为对应R{i}的所有元素之和
%Radd = zeros(1,blockRtotal);
%for k = 1:blockRtotal
% for t = 1:blocksizeR
% for s = 1:blocksizeR
% T(1,k) = T(1,k) + R{k}(t,s);
% end
% end
%end
Radd = addofall(blockRtotal,R);
%Uadd为U{i}的所有元素之和构成的矩阵,P为U{i}所有元素平方和构成的矩阵
Wadd = addofall(blockWtotal,W);
Wsquareadd = multiofall(blockWtotal,W,W);
Rsquareadd = multiofall(blockRtotal,R,R);
%RmultiUadd为一个矩阵,其中的第i,j个元素对应R{i}与U{j}的乘积的和
RmultiWadd = zeros(blockRtotal,blockWtotal);
for t = 1:blockRtotal
for s = 1:blockWtotal
Matrixtemp = R{t}.*W{s};
RmultiWadd(t,s) = sum(Matrixtemp(😃);
end
end
WmultiWadd = zeros(blockWtotal,blockWtotal);
for s = 1:blockWtotal
for t = s:blockWtotal
Matrixtemp = W{t}.*W{s};
WmultiWadd(s,t) = sum(Matrixtemp(😃);
% UmultiUadd(t,s) = UmultiUadd(s,t);
end
end

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]俞玉莲.一种改进的分形图像压缩算法[J].信息技术. 2015,(06)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于Matlab分形插值程序是一种使用分形几何原理进行图像插值的技术。它可以通过对原始图像进行分形变换,生成具有更高分辨率和更丰富细节的图像。 这个程序包括以下几个主要步骤: 1. 图像加载:首先,需要使用Matlab的图像处理工具箱加载原始图像,将其转换为灰度图像,以便后续的处理。 2. 分形变换:使用分形几何的理论,将原始图像进行分形变换。这个过程通常包括将原始图像分割成小块,然后对每个小块进行平移、旋转、缩放等操作,以生成更多的细节和结构。这些变换也可以根据特定的分形维度或规则进行调整,以控制生成图像的细节丰富程度。 3. 图像重建:根据分形变换过程生成的分形图像数据,通过插值算法将其转换为具有更高分辨率的图像。常用的插值算法包括双线性插值、双三次插值等。插值过程可以通过计算每个像素的亮度值来进行,也可以通过计算颜色值来进行。 4. 结果显示:生成的插值图像可以使用Matlab的图像显示功能展示出来,以供用户观看和分析。用户也可以根据自己的需求对插值参数进行调整,以探索更多不同的结果。 基于Matlab分形插值程序在图像处理、数字艺术等领域具有广泛的应用。它可以用于图像重建、纹理合成、艺术创作等方面。通过分形插值技术生成的图像通常具有独特的细节和纹理特征,可以用于增强原始图像的视觉效果。同时,这种程序也提供了一个创作平台,让用户可以通过调整分形参数和插值算法来实现个性化的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海神之光

有机会获得赠送范围1份代码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值