Matlab:矩阵操作:在二进制矩阵中改变中心像素周围的像素值

时间:2013-04-22 17:56:16

标签: matlab

我今天有另一个问题: 我有一个二进制矩阵t,其中1代表河道,0代表洪水平面和周围的山脉:

t = Alog>10;
figure
imshow(t)
axis xy

为了进一步计算,我想在每个方向上扩展河道的面积几个像素。一般来说,我希望图像中显示更宽的通道,以便在以后的水力模型中包含更大的区域。

这是我的尝试,它在某些地区有效,但在河流与x-y轴成对角线的区域,它不会加宽通道。似乎有一种接近这一点的流程,我无法理解。

[q,o] = find(t == 1);   

qq = zeros(length(q),11);
oo = zeros(length(o),11);

% add +-5 pixel to result
for z=1:length(q)
    qq(z,:) = q(z)-5:1:q(z)+5;
    oo(z,:) = o(z)-5:1:o(z)+5;
end
% create column vectors
qq = qq(:);
oo = oo(:);

cords = [oo qq]; % [x y]

% remove duplicates
cords = unique(cords,'rows');

% get limits of image
[limy limx] = size(t);

% restrict to x-limits
cords = cords(cords(:,1)>=1,:);
cords = cords(cords(:,1)<=limx,:);

% restrict to y-limits
cords = cords(cords(:,2)>=1,:);
cords = cords(cords(:,2)<=limy,:);

% test image
l = zeros(size(img));
l(sub2ind(size(l), cords(:,2)',cords(:,1)')) = 1;
figure
imshow(l)
axis xy

这是我得到的图像:

它确实扩大了某些领域的频道,但通常我的方法似乎存在缺陷。当我在对角线像素上使用相同的方法时,它根本不会加宽线,因为它只会创建更多对[1 1; 2 2; 3 3;等等]。 是否有更好的方法来处理这个甚至是图像处理领域的问题? 具有设定直径的模糊滤镜应该有点类似,但我找不到任何有用的东西......

PS:我不允许添加图片,虽然我已经有10个代表,所以这里是直接链接:

http://imageshack.us/a/img14/3122/channelthin.jpg http://imageshack.us/a/img819/1787/channelthick.jpg

2 个答案:

答案 0 :(得分:1)

您可以从图像处理中应用morphological operationsMorphological dilation可以在您的示例中使用。

从图像处理工具箱中,您可以使用bwmorth命令BW2 = bwmorph(BW,'dilate')或imdilate命令IM2 = imdilate(IM,SE)

IM是您的图片,SE是结构元素。您可以设置SE = ones(3);以二进制图像扩展“一个像素” - 但可以根据您的应用程序进行更改。或者,如果需要,您可以使用相同的结构元素对图像进行多次扩张。

答案 1 :(得分:1)

如果您有图像处理工具箱,则应使用imdilate功能。这将执行形态dilation operation。请尝试以下代码:

SE = strel('square',3);
channelThick = imdilate(channelThin,SE);

其中SE是3x3平方structuring element,用于扩展存储在channelThin中的图像。这将在每个方向上将channelThin中的区域扩展一个像素。要扩展更多,请使用更大的结构元素或多次迭代。