torch平臺上利用K-means方法實現SAR影象變化檢測
阿新 • • 發佈:2018-12-30
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法後得到的結果圖: