我今天有另一个问题: 我有一个二进制矩阵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
答案 0 :(得分:1)
您可以从图像处理中应用morphological operations。 Morphological 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中的区域扩展一个像素。要扩展更多,请使用更大的结构元素或多次迭代。