姑且把原理贴出来
有空的时候我会把原理敲一遍的,不过姑且贴出来
网上找的原理是求微分的,不过这个直接作差,感觉有区别,但可能不大吧,这个实现是比较简单
据说应用是轮廓提取,感觉效果不错
贴一下代码
导入灰度图,这里灰度图是一张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方阵处理
具体转化的话请自行写个33的矩阵自己模拟一下就懂了,我就不贴了
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,[])