2013-04-22 70 views
1

我今天有另一個問題: 我有一個二進制矩陣t,其中1代表河道,0代表洪水面和周圍山脈:Matlab:矩陣操縱:改變二進制矩陣中心像素周圍的像素值

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

回答

1

如果您有圖像處理工具箱,則應使用imdilate函數。這將執行形態學dilation operation。嘗試以下代碼:

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

其中SE是用於擴張存儲在channelThin圖像的3×3平方structuring element。這將在每個方向上將channelThin中的區域擴大一個像素。要擴展更多,請使用更大的結構元素或多次迭代。

+0

完美的,我期待的快速簡單的解決方案。我想知道是否有辦法找到像這樣的解決方案(之前沒有使用它們),而不詢問這樣的社區。我無法將我的問題與這些工具聯繫起來...... – TheodorBecker 2013-04-22 18:50:15

1

你可以從圖像處理應用morphological operations。您的示例中可以使用Morphological dilation

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

其中IM是您的圖片和SE是結構元素。您可以設置SE = ones(3);以「一個像素」擴大二進制圖像 - 但可以根據您的應用進行更改。或者,如果需要,您可以使用相同的結構元素多次擴大圖像。

+0

非常好。謝謝! imdilate和bwmorph的用法有什麼不同,除了bwmorph不允許更改結構元素? – TheodorBecker 2013-04-22 18:49:21

+0

二進制輸入圖像沒有區別。一般而言,圖像處理工具箱中以「bw」開頭 的功能指的是對二進制圖像的操作,而具有「im」 前綴的功能指的是對灰度圖像執行操作的功能。我認爲'imdilate'可以將灰度圖像作爲輸入,並且可以讓您設置自己的結構元素。 – Alexey 2013-04-22 18:53:29

+0

我明白了,好吧!感謝您的同樣有用的答案和幫助! – TheodorBecker 2013-04-22 18:57:00