我有一个双重图像,我的目标是将其转换为逻辑。我想创建5x5窗口并将其放在图像中的每个像素上。然后,我计算这25个像素的平均值。如果中心像素值大于平均值,则为1.否则为0.
我该怎么做?
P.S。我不想这样做:
IM[i - 2, j - 2]
IM[i - 1, j - 2]
IM[i, j - 2]
IM[i + 1, j - 2]
IM[i + 2, j - 2]
.
.
答案 0 :(得分:1)
有几种方法(运行时间可能按递减顺序):
使用nlfilter
:
result = nlfilter(im, [5 5], @(x) x(3,3)>mean(x(:)));
使用blockproc
:
result = blockproc(im, [1 1], @(x) x.data(3,3)>mean(x.data(:)), ...
'Bordersize', [2 2], 'Trimborder', 0);
请注意,对于blockproc
,我们需要指定大小为1x1的块(以便块在每个方向上从一个像素移动到另一个像素),在wach像素周围的eacch方向上的大小为2的边界(得到5x5块),并防止修剪功能结果,因为结果只有1个值。
使用conv2
:
result = im > conv2(im, ones(5,5)/25, 'same');
答案 1 :(得分:0)
如果我是对的,这似乎是一种异常方法。以下代码可能是您想要的:
mask = 0.04 * ones(5); mask(3, 3) = 0; % // mask is for average the double image
avgIm = filter2(mask, imd); % // imd is your double image.
output = imd > avgIm;