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法后得到的结果图:
5总结
上述结果十分粗糙,主要原因是没有进行滤波,后续工作会加上滤波过程.
参考资料
http://blog.csdn.net/zhanghe2775115/article/details/49560625