我想计算图像的渐变I.我有两个选项
[Gx, Gy] = gradient(I);
g = sqrt(Gx.^2+Gy.^2);
和
[g,~] = imgradient(I, 'sobel');
我的问题是
在第一个选项中使用的渐变方法是什么?
使用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')
当图像添加噪声时,不同的将更清晰
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')
作为可视化,第二个选项提供了更多的亮度值
答案 0 :(得分:8)
区别在于'Sobel'运营商。索贝尔算子是一个矩阵,与图像进行卷积以计算其方向梯度。
sobel运算符定义为(来自维基百科):
而gradient
所做的只是方向差异。您可以将其解释为渐变
Gx=[ 0 0 0; Gx=[ 0 -1 0;
-1 0 1; and 0 0 0;
0 0 0] 0 1 0];
这种差异是因为当一个人有图像时,就知道它是一个连续域的离散化。 Sobel算子有助于考虑在给定像素周围发生的事情。
答案 1 :(得分:8)
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')
对于imgradient
,有五种选择:
虽然文档说明:
针对每个列出的
imgradient
采用的算法方法 梯度方法首先计算方向梯度Gx
和Gy
, 相对于x轴和y轴。沿着x轴定义x轴 向右的列和沿着行的y轴定义 下。然后计算梯度幅度和方向 他们的正交分量Gx
和Gy
。