1

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

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

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

这是我的尝试,它在某些地区确实有效,但在河流与 xy 轴对角线的地区,它不会拓宽河道。似乎有一种接近这个的流程,我不能完全理解。

[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; ETC]。有没有更好的方法来解决这个问题,甚至是图像处理领域的东西?具有设定直径的模糊滤镜的工作方式应该有点相似,但我找不到任何有用的东西......

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

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

4

2 回答 2

1

您可以应用图像处理中的形态学操作。在您的示例中可以使用形态膨胀。

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

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

于 2013-04-22T18:11:41.230 回答
1

如果你有图像处理工具箱,你应该使用imdilate函数。这执行形态膨胀操作。试试下面的代码:

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

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

于 2013-04-22T18:17:52.113 回答