您的代码中的问题就在您应用噪音之前。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);
我得到:
至于未来的发展,我建议你使用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);