输入图片
我试图在图像上应用希尔伯特变换。我的目标是检测图像中的边缘。我无法显示图像。我的代码如下:
clear; close all;
I = imread('sub.png');
ty = rgb2gray(I);
figure; imshow(ty)
ty= double(ty);
ty = adapthisteq(ty);
filtSize = 10;
H1 = fspecial('gaussian',[filtSize,filtSize],2);
H2 = fspecial('gaussian',[filtSize,filtSize],2);
H = H2-H1;
Hedge = imag(hilbert(H));
Iodd = sqrt(imfilter(ty,Hedge).^2 + imfilter(ty,Hedge.').^2);
figure; imshow(Iodd)
G = log(Iodd);
G = max(G(:)) - G;
figure,
imshow(G), colorbar
2)图像的梯度结果和希尔伯特变换之间是否存在差异?
答案 0 :(得分:0)
您会看到一个黑色图像,因为它中的所有值都非常接近0,甚至可能是负值。要查看某些内容,您需要重新调整值。
根据您获得的错误,您的图片中必须有NaN。在显示之前尝试执行G(isnan(G)) = 0;
。
什么是min(G(:))
?什么是max(G(:))
?你对这个范围的期望是什么?
答案 1 :(得分:0)
它与输出完全无关。
在您的代码Iodd
中,所有值均为零。这意味着log(Iodd)
未定义,因此NaN
。 G
只是NaN
。
不幸的是,因为你不知道自己在做什么!
首先,adapthisteq
需要双重图像,但是等待!数据类型为double且双重图像不完全相同的图像。双图像是0-1的图像,数据是双的图像只是记忆的图像。你想要0-1。因此,您不希望ty= double(ty);
,您需要ty= im2double(ty);
。在imshow(ty)
之后添加adapthisteq
,检查两者之间的差异。
然后是你的下一部分代码。你做了一些奇特的东西! hilbert
,imag
,内核,......很好。不幸的是,再次,你犯了一个大错误!
我建议你仔细看看这段代码:
H1 = fspecial('gaussian',[filtSize,filtSize],2);
H2 = fspecial('gaussian',[filtSize,filtSize],2);
H = H2-H1;
如果你仔细观察,你会很快意识到你正在创建2个相同的内核并减去它们。猜猜H
有什么价值。
您正在使用全零的内核过滤图像。然后取对数!!!!