Jam*_*ame 5 algorithm matlab image-processing computer-vision
我想计算图像的渐变I.我有两种选择
[Gx, Gy] = gradient(I);
g = sqrt(Gx.^2+Gy.^2);
Run Code Online (Sandbox Code Playgroud)
和
[g,~] = imgradient(I, 'sobel');
Run Code Online (Sandbox Code Playgroud)
我的问题是
在第一个选项中使用的梯度法是什么?
使用sobel方法找到梯度的原因是什么?
谢谢大家
这是我试过的
I=zeros([128 128]);
I(50:100,50:100)=100;
[Gx, Gy] = gradient(I);
g1 = sqrt(Gx.^2+Gy.^2);
[g2,~] = imgradient(I, 'sobel');
subplot(121);imshow(g1,[]);title('First option')
subplot(122);imshow(g2,[]);title('Second option')
Run Code Online (Sandbox Code Playgroud)
当图像添加噪声时,不同的将更清晰
I=zeros([128 128]);
I(50:100,50:100)=100;
%% Add noise image;
noiseStd=5;
I_noise = I + (noiseStd * randn([128, 128]));
[Gx, Gy] = gradient(I_noise);
g1 = sqrt(Gx.^2+Gy.^2);
[g2,~] = imgradient(I_noise, 'sobel');
subplot(121);imshow(g1,[]);title('First option')
subplot(122);imshow(g2,[]);title('Second option')
Run Code Online (Sandbox Code Playgroud)
作为可视化,第二个选项提供了更多的亮度值
不同之处在于"Sobel"运营商.索贝尔算子是一个矩阵,与图像进行卷积以计算其方向梯度.
索贝尔算子被定义为(来自维基百科):
什么gradient只是方向差异.您可以将其解释为渐变
Gx=[ 0 0 0; Gx=[ 0 -1 0;
-1 0 1; and 0 0 0;
0 0 0] 0 1 0];
Run Code Online (Sandbox Code Playgroud)
这种差异是因为当一个人有图像时,就知道它是一个连续域的离散化.Sobel算子有助于考虑在给定像素周围发生的事情.
gradient专门使用中心差异,并imgradient为您提供选择,例如'central',或默认'sobel'.使用第一个选项imgradient看起来与gradient:
I=zeros([128 128]);
I(50:100,50:100)=100;
%% Add noise image;
noiseStd=5;
I_noise = I + (noiseStd * randn([128, 128]));
[Gx, Gy] = gradient(I_noise);
g1 = sqrt(Gx.^2+Gy.^2);
[g2,~] = imgradient(I_noise, 'sobel');
[g3,~] = imgradient(I_noise, 'central');
subplot(131);imshow(g1,[]);title('gradient')
subplot(132);imshow(g2,[]);title('imgradient sobel')
subplot(133);imshow(g3,[]);title('imgradient central')
Run Code Online (Sandbox Code Playgroud)
对于imgradient有五个选项:
虽然文档说明:
imgradient针对每个列出的梯度方法采用的算法方法是首先计算方向梯度,Gx并且Gy相对于x轴和y轴.沿着向右的列定义x轴,沿着向下的行定义y轴.梯度大小和方向,然后从它们的正交分量计算Gx和Gy.