1. 程式人生 > >torch平臺上利用K-means方法實現SAR影象變化檢測

torch平臺上利用K-means方法實現SAR影象變化檢測

1 SAR影象變化檢測步驟 :
  首先獲取原始SAR影象的對數比值影象,再利用kmeans方法對比值影象的畫素值進行聚類,聚成2類,由此得到粗略的變化檢測結果.

2 K-means聚類演算法
K-means演算法是聚類演算法中最簡單的一種。聚類指的就是將一堆具有類似特徵的無標籤點歸位一類,比如黑種人和黃種人由於身高、體型、膚色、毛髮各個特徵上的不同(單純膚色說服力不夠)而聚類為兩個簇。K-means演算法通過迭代優化將樣本聚類成k個簇。
演算法流程:
(1)、任取k個質心;
(2)、求出每個樣本到每個質心的距離,並將其歸至距離最近的簇;
(3)、根據上一步歸類的樣本,重新計算質心(各項特徵的平均值);
(4)、迭代2、3直至質心不再變化.

3  程式碼
(1) lograte.lua

print('===>計算對數比值影象:')
im1=image.load('1999.04.png')   --讀取圖片
im2=image.load('1999.05.png')   --讀取圖片
im1:mul(255)
im2:mul(255)
a1 = im1[{{1},{},{}}]
a2 = im2[{{1},{},{}}]
aa1 = a1[1]
aa2 = a2[1]
dim = aa1
-----------------------------------------------------------
dd = {}
for
i = 1,301 do dd[i] = {} for j = 1,301 do dd[i][j] = aa1[i][j]/aa2[i][j] end end ----------------------------------------------------------- for i = 1,301 do for j = 1,301 do dim[i][j] = dd[i][j] end end dim:log() dim:abs() image.save('lograte.png',dim) -- 儲存影象
----------------------------------------------------------- print(' 對數比值影象:') dim1=image.load('lograte.png') itorch.image(dim1)

(2) kmeans_chde.lua

im = image.load('lograte.png')
itorch.image(im)
ima = im[1]
N  = ima:size()
print(N)
nkernels = 1
niter = 1

I = im:view(-1,1)  --轉化為列向量
--轉化為列向量也可以用這個函式==> I = im:reshape(N[1]*N[2])

centroids,count = unsup.kmeans(I, nkernels, niter, nil, nil, true)   
--利用kmeans函式進行聚類
--centroids為聚類中心
print(#centroids)
print(count)
----------------------------------------
for i = 1,301 do
    for j = 1,301 do
        if ima[i][j]>centroids[1][1] then
                ima[i][j] = 1
        else    ima[i][j] = 0
        end
    end
end
image.save('final_image.png',ima) 
----------------------------------------
dim1=image.load('final_image.png')
print('         kmeans法後得到的結果圖:')
itorch.image(dim1)

(3) main.lua

require 'torch'
require 'image'
require 'unsup'
dofile 'lograte.lua'
dofile 'kmeans_chde.lua'

4 結果
      對數比值影象:
對數比值影象
    kmeans法後得到的結果圖:
粗略變化檢測結果