因此,我想测量图像的垂直边缘,以便稍后将其用作2D到3D转换的深度提示。
为此,我将计算每个块的水平梯度值以测量垂直边缘,如下所示:
̅ g(x,y) = 1/N ∑_((x',y')∈ Ω(x,y))〖g(x', y')〗
其中:
g(x',y')是像素位置的水平渐变(x',y'),
omega(x,y)是像素位置的邻域(x',y')
和N是欧米茄(x,y)中的像素数。
以下是我在matlab上做的事情:
I = im2double(imread('landscape.jpg'));
% convert RGB to gray
gI = rgb2gray(I);
[nrow, ncol] = size(gI);
% divide the image into 4-by-4 blocks
gI = mat2tiles((gI),[4,4]);
N = 4*4; % block size
% For each block, compute the horizontal gradient
gI = reshape([gI{:}],4*4, []);
mask = fspecial('sobel');
g = imfilter(gI, mask);
g_bar = g./N;
g_bar = reshape(g_bar,nrow, ncol);
我是Matlab的新手,所以我不确定我的代码是否以正确的方式表达了这个等式。
如果您认为这是正确的,可以告诉我吗?因为我不确定如何测试输出!
答案 0 :(得分:1)
您无需将图像分解为4 x 4块。水平梯度可与Sobel滤波器或Prewitt滤波器一起使用,该滤波器为3 x 3,可直接放入imfilter
。 imfilter
为您执行带有指定掩码/内核的2D卷积/过滤,因此无需进行平铺。因此,您可以将imfilter
与fspecial
定义的掩码一起使用,并定义N = 9
。因此:
I = im2double(imread('landscape.jpg'));
% convert RGB to gray
gI = rgb2gray(I);
N = 9;
mask = fspecial('sobel');
g = imfilter(gI, mask);
g_bar = g./N;
根据经验,增加渐变蒙版的大小不会给您带来更好的效果。您希望确保掩码尽可能小,以捕获尽可能多的本地更改。