Bac*_*con 2 matlab image-processing noise edge-detection sobel
我正在研究检测图像边缘的脚本.
这是脚本:
clear all; close all; clc;
c = rgb2gray(imread('image_S004_I0004.jpg'));
c = double(c);
k = imnoise(c, 'salt & pepper', 0.01);
gg = [-1 0 1;-2 0 2; -1 0 1];
gh = gg';
grad_g = conv2(k, gg);
grad_h = conv2(k, gh);
grad = sqrt(grad_g.^2 + grad_h.^2);
[r s] = size(grad);
T = 80;
for ii = 1:r
for jj = 1:s
if grad(ii, jj) < T
thresh_grad(ii, jj) = 0;
else
thresh_grad(ii, jj) = 1;
end
end
end
figure()
subplot(121); imshow(uint8(c));
subplot(122); imshow(thresh_grad);
Run Code Online (Sandbox Code Playgroud)
这是我一直得到的:

左边是原始图像,右边应该是检测到边缘的图像(正如你在脚本中看到的,我在图像上实现了一些噪声 - 必须在那里).但是我什么都没有,无论阈值T的值是什么.
你能帮我找到我的错吗?
在应用噪声之前,代码中存在问题.您double在调用之前将图像转换为imnoise.通过这样做,double假设精确图像具有动态范围,[0,1]因此输出imnoise将被剪切到该[0,1]范围.这意味着您的阈值80因此将不合适,因为永远不会有任何超过80的值的梯度值,因此所有内容都可视化为黑色.
此外,thresh_grad未定义,建议您在使用之前预先分配图像.只需thresh_grad = zeros(size(grad));在双for循环之前完成.
因此,double在您进行调用之后调用imnoise会使图像仍然存在uint8,然后转换double为卷积的目的.通过这样做,我设法获得输出.我无法访问您的图像,但我使用了cameraman.tif内置于MATLAB图像处理工具箱中的图像.
因此:
c = imread('cameraman.tif');
k = imnoise(c, 'salt & pepper', 0.01);
k = double(k); % Change
gg = [-1 0 1;-2 0 2; -1 0 1];
gh = gg';
grad_g = conv2(k, gg);
grad_h = conv2(k, gh);
grad = sqrt(grad_g.^2 + grad_h.^2);
[r, s] = size(grad);
thresh_grad = zeros(size(grad)); % Added
T = 80;
for ii = 1:r
for jj = 1:s
if grad(ii, jj) < T
thresh_grad(ii, jj) = 0;
else
thresh_grad(ii, jj) = 1;
end
end
end
figure()
subplot(121); imshow(uint8(c));
subplot(122); imshow(thresh_grad);
Run Code Online (Sandbox Code Playgroud)
我明白了:
至于未来的开发,我建议您使用im2double实际将图像转换为double精度,这也将数据转换为[0,1]范围.因此,你需要的门槛从改变80到80/255作为门槛80最初设计用于uint8图像.
最后,当您显示原始图像时,您可以摆脱uint8投射.
为了完整性:
c = imread('cameraman.tif');
c = im2double(c); % Change
k = imnoise(c, 'salt & pepper', 0.01);
gg = [-1 0 1;-2 0 2; -1 0 1];
gh = gg';
grad_g = conv2(k, gg);
grad_h = conv2(k, gh);
grad = sqrt(grad_g.^2 + grad_h.^2);
[r, s] = size(grad);
thresh_grad = zeros(size(grad)); % Added
T = 80 / 255; % Change
for ii = 1:r
for jj = 1:s
if grad(ii, jj) < T
thresh_grad(ii, jj) = 0;
else
thresh_grad(ii, jj) = 1;
end
end
end
figure()
subplot(121); imshow(c);
subplot(122); imshow(thresh_grad);
Run Code Online (Sandbox Code Playgroud)