1

我試圖在該圖像中分割天空和水部分。如何分割圖片中的天空和水部分

Link of the Picture 我嘗試了很多方法,如k均值,閾值,多閾值等BUT不幸的是沒有工作得很好。 這裏是我的代碼(Matlab的)一個例子:

img=imread('1.jpg'); 
im_gray=rgb2gray(img); 
b=imadjust(im_gray); 
imshow(b); 
bw_remove_small=imopen(b,strel('square',5)); 
imshow(bw_remove_small); %after 1st iteration 
m3=medfilt2(bw_remove_small,[18,16]); 
imshow(m3); 
m3=medfilt2(bw_remove_small,20,20]); 
m3=medfilt2(bw_remove_small,[20,20]); 
imshow(m3); 
I1=m3; 
I2=rgb2gray(I1); 
I=double(I2); 
figure 
subplot(1,3,1) 
imshow(I1) 
subplot(1,3,2) 
imshow(I2) 
g=kmeans(I(:),4); 
J = reshape(g,size(I)); 
subplot(1,3,3) 
imshow(J,[]); 

任何一個可以幫我請

+1

那麼,它會更容易手動做到這一點。正確標記您的問題可能會有幫助,但是,這是什麼語言? –

+1

您可能會考慮在圖像的邊緣圖上使用霍夫變換(可用於MATLAB)來查找地平線。然後確定圖片的哪一半包含天空或水不是太困難。 – Falimond

+1

我會嘗試使用顏色信息。你正在用'rgb2gray'丟棄它。 –

回答

0

圖片的兩個區域是在色調,紋理和灰度級亮度不同?

從我們的角度來看,地平線是圖像中的最佳線條,可以通過亮度的明顯變化來看到。由於圖像亮度不平,因此亮度不適用於單個閾值,因此使用亮度模型來分解天空或水。這意味着對目標的瞭解,但有兩件事可以給你一個近似的答案:紋理和/或色調。

閾值爲120的色調(源自色相直方圖)會給你兩個區域,但不會乾淨地劃分,並且會有重疊的部分。雖然使用這兩個部分可以找到亮度模型。

與紋理相同。使用圖像的一小部分,減去直流輸出,然後平均或只是總結非直流部分將產生一個帶有兩個峯值的直方圖,這些峯值可能不像色調那樣明顯,但足以發現一個閾值和兩個可以找到亮度模型的區域。

關鍵的事實是,如果天空正確地建模爲灰色表面,那麼您可以將它從圖像中減去,並使用一個簡單的閾值將其拉出。

在這幅圖像中邊緣檢測非常嘈雜,以便能夠輕鬆看到線條,但是如果您可以拉出圖像線而不會丟失形狀,那麼尋找直線和長輪廓可能會減少代碼/工作量。

希望這有助於一些!當天空和山脈之間沒有很大的差別時,我用它來尋找遠處的山脈。另外我只是在你的照片上試過這個,幾乎沒有好的天空模型就得到了很好的答案。