在python中,一般的影像處理庫或者繪圖庫無法處理或顯示遙感影像,例如Matplotlib,opencv,scipy等等,用這些庫讀取遙感影像數值會發生一定的錯誤,從而導致后續作業無法展開,因此我們需要用到GDAL這個庫,
GDAL的安裝
GDAL輪子安裝網址

找到與自己python相對應的版本即可
輪子安裝完成后,在終端cd到輪子的安裝位置,輸入pip install “檔案名”
這樣就完成GDAL的安裝了
批量讀取遙感影像
import os
from osgeo import gdal
filedir = "D:/img" # 圖片所在路徑
for image in os.listdir(filedir):
print(image)
driver = gdal.GetDriverByName("GTiff")
driver.Register()
img = gdal.Open(filedir + '/' + image)
im_width = img.RasterXSize # 柵格矩陣的列數
print("im_width:", im_width)
im_height = img.RasterYSize # 柵格矩陣的行數
print("im_height:", im_height)
band = img.GetRasterBand(1)
im_data = img.ReadAsArray(0, 0, im_width, im_height) # 獲取資料
print(im_data)
迭代法閾值選擇演算法
迭代法閾值選擇演算法是對雙峰法的改進,首先選擇一個近似的閾值T,將影像分割成兩份,R1和R2,分別計算出R1和R2的均值u1和u2,再選擇新的閾值T=(u1+u2)/2,重復以上步驟,直到u1和u2不再變化,
迭代法是基于逼近的思想,其步驟如下:
(1)求出影像的最大灰度值和最小灰度值,分別記為ZMAX和ZMIN,令初始閾值為T=(ZMAX+ZMIN)/2
(2)根據閾值T將影像分割為前景和背景,分別求出兩者的平均灰度值ZO和ZB
(3)求出新閾值T=(ZO+ZB)/2
(4)若兩個平均灰度值ZO和ZB不再發生變化(或T不再變化),則T為閾值,否則轉(2)迭代計算
完整代碼
import cv2
import os
import numpy as np
import pandas as pd
from osgeo import gdal
filedir = "D:/img" # 圖片所在路徑
savedir = "D:/image" # 保存路徑
for image in os.listdir(filedir):
print(image)
driver = gdal.GetDriverByName("GTiff")
driver.Register()
img = gdal.Open(filedir + '/' + image)
im_width = img.RasterXSize # 柵格矩陣的列數
print("im_width:", im_width)
im_height = img.RasterYSize # 柵格矩陣的行數
print("im_height:", im_height)
band = img.GetRasterBand(1)
im_data = img.ReadAsArray(0, 0, im_width, im_height) # 獲取資料
print(im_data)
img = np.array(im_data)
ZMAX = 0; ZMIN = 255
ZO = 0; ZB = 255
for i in img:
if max(i) > ZMAX:
ZMAX = max(i)
if min(i) < ZMIN:
ZMIN = min(i)
T = (ZMAX + ZMIN) / 2
img = pd.DataFrame(img)
while True:
ZO_ = img[img>T].mean().mean()
ZB_ = img[img<=T].mean().mean()
if (ZO_ == ZO) and (ZB_ == ZB):
break
else:
ZO = ZO_; ZB = ZB_
T = (ZO + ZB) / 2
print(T)
img[img>T] = 255
img[img<=T] = 0
tiff.imsave(savedir + '/' + image, np.array(img)) # 保存二值化后的影像
print("finish")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301858.html
標籤:其他
下一篇:VGGNet
