TV全变差 轮廓提取

姑且把原理贴出来

有空的时候我会把原理敲一遍的,不过姑且贴出来
网上找的原理是求微分的,不过这个直接作差,感觉有区别,但可能不大吧,这个实现是比较简单
据说应用是轮廓提取,感觉效果不错
全变差原理公式

贴一下代码

导入灰度图,这里灰度图是一张700*500的图像
前面是矩阵移位操作
挺无聊的 ,随手记录下,方便以后的matlab矩阵相关开发,随手积累点代码

load I.mat
figure,imshow(I,[])

N = 500;
M = 750;
Ih = zeros(M,N);
Iv = zeros(M,N);
Ih(:,1:end-1) = I(:,2:end);
Ih(:,500) = I(:,1);
IhA = Ih - I;

Iv(1:end-1,:) = I(2:end,:);
Iv(750,:) = I(1,:);
IvA = Iv - I;
Y = sqrt(IhA.^2+IvA.^2);
figure,imshow(Y,[])

另一种实现方法

挺无聊的,也不知道为什么要再实现一次,明明上一次也没有用for,不过实测是变快了点
将操作转换成矩阵
行列式我永远也记不住的老规矩了,左行右列
因为原始矩阵是MN的,左乘MM方阵处理,右乘NN方阵处理
具体转化的话请自行写个3
3的矩阵自己模拟一下就懂了,我就不贴了

figure,imshow(I,[])
M = 750;
N = 500;

%生成左乘操作系数阵,形式如下
%[1 -1 0 0]
%[0 1 -1 0]
%[0 0 1 -1]
%[-1 0 0 1]
M_array =  ones(M,1);
M_Opeator = diag(M_array);
M_Opeator = M_Opeator - diag(ones(M-1,1),1);
M_Opeator(end,1) = -1;
%生成右乘操作系数阵,形式如下
%[1 0 0 -1]
%[-1 1 0 0]
%[0 -1 1 0]
%[0 0 -1 1]
N_array =  ones(N,1);
N_Opeator = diag(N_array);
N_Opeator = N_Opeator - diag(ones(N-1,1),-1);
N_Opeator(1,end) = -1;

Ih = M_Opeator*I;
Iv = I*N_Opeator;
Y = sqrt(Iv.^2 + Ih.^2);
figure,imshow(Y,[])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

define_mine

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值