python的sklearn模組中有封裝好的meanshift方法,下面試一下看看
# -*- coding: utf-8 -*-
import cv2
import gdal
import numpy as np
from sklearn.cluster import meanshift, estimate_bandwidth
defread_img
(filename)
: dataset=gdal.open(filename)
im_width = dataset.rasterxsize
im_height = dataset.rasterysize
im_geotrans = dataset.getgeotransform(
) im_proj = dataset.getprojection(
) im_data = dataset.readasarray(0,
0,im_width,im_height)
del dataset
return im_proj,im_geotrans,im_width, im_height,im_data
defwrite_img
(filename, im_proj, im_geotrans, im_data):if
'int8'
in im_data.dtype.name:
datatype = gdal.gdt_byte
elif
'int16'
in im_data.dtype.name:
datatype = gdal.gdt_uint16
else
: datatype = gdal.gdt_float32
iflen(im_data.shape)==3
: im_bands, im_height, im_width = im_data.shape
else
: im_bands,
(im_height, im_width)=1
,im_data.shape
driver = gdal.getdriverbyname(
"gtiff"
) dataset = driver.create(filename, im_width, im_height, im_bands, datatype)
dataset.setgeotransform(im_geotrans)
dataset.setprojection(im_proj)
if im_bands ==1:
dataset.getrasterband(1)
.writearray(im_data)
else
:for i in
range
(im_bands)
: dataset.getrasterband(i+1)
.writearray(im_data[i]
)if __name__ ==
'__main__'
: img_path =
'e:/sb/sb_test1.tif'
im_proj, im_geotrans, im_width, im_height, im_data = read_img(img_path)
im_data = im_data[0:
3,..
.]#遙感影像是4波段的這裡取三個波段,不然報錯,方法還不支援四個波段
im_data = im_data.transpose((2
,1,0
))im_temp = im_data.reshape((-
1,3)
) im_temp = np.float32(im_temp)
bandwidth=estimate_bandwidth(im_temp, quantile=
0.2, n_samples=
500)
#自動計算頻寬
ms = meanshift(bandwidth=bandwidth, bin_seeding=
true
, cluster_all=
true
) ms.fit_predict(im_temp)
labels=ms.labels_
cluster_centers = ms.cluster_centers_
seg = labels.reshape(
(im_data.shape[0]
, im_data.shape[1]
))seg = seg.transpose(1,
0)seg_path =
'e:/sb/test/sb_test1_seg.tif'
write_img(seg_path, im_proj, im_geotrans, seg)
原圖:
結果:
資料是10公尺解析度的哨兵資料,很明顯演算法在低解析度的影像上對水體還有林地這樣面積比較大邊界不是稜角分明的地物型別是很有效的,下一步的關鍵就是合併同類。另外,效果還可以通過調整引數quantile=0.2, n_samples=500來調整。
注意這裡是自動聚類,本次一共有66個類(引數不同類別不同),不管你視覺上看不看得出**是水**是林地,你實際是無法確定那個就是水的,類別(屬性)並沒有標明,只有類別上的區分。
opencv2用均值漂移演算法跟蹤特定顏色的物體
同樣的,之前的滑鼠事件和均值漂移演算法清楚後,這只是個運用而已 include include include include include include include include include include includeusing namespace cv using namesp...
機器學習筆記 監督學習 無監督學習分類筆記
無監督學習 給出一資料組,並已知曉這組資料的對應關係,然後給出一組新的資料,嘗試對其進行 和分析,這裡注意,提前給出的資料組 data set 是已知內部的資料的對應關係,後面給出的新的資料,是要依據對之前資料的學習後,給出新的資料對應的 值。而對於 的結果的不同,又將監督學習分為分類 classf...
有監督學習 無監督學習 分類 聚類 回歸等概念
這篇是很久之前寫的了.後來才開始上 andrew ng 老師的 mooc,發現其實老師講得很好了,建議有時間看看他的 machina learning 只看第一節課就可以很了解這些概念了。主要內容 有監督學習 無監督學習 分類 聚類 回歸等概念 這裡舉乙個給書本分類的例子。部分參考 什麼是無監督學習...