核心要点
本方法是针对遥感数据的,因此使用了Gdal,如果你针对的是普通的图片,就直接使用cv2.imread()来读取即可,就不需要gdal了。
np.percentile()函数
np.clip()函数
cv2.split()函数
cv2.merge()函数
gdal的使用
本代码适用于ipython
若在编辑器下使用,需要自行的稍作修改
主体是函数TwoPercentLinear。
import numpy as np
import cv2
from matplotlib import pyplot as plt
def TwoPercentLinear(image, max_out=255, min_out=0):
b, g, r = cv2.split(image)#分开三个波段
def gray_process(gray, maxout = max_out, minout = min_out):
high_value = np.percentile(gray, 98)#取得98%直方图处对应灰度
low_value = np.percentile(gray, 2)#同理
truncated_gray = np.clip(gray, a_min=low_value, a_max=high_value)
processed_gray = ((truncated_gray - low_value)/(high_value - low_value)) * (maxout - minout)#线性拉伸嘛
return processed_gray
r_p = gray_process(r)
g_p = gray_process(g)
b_p = gray_process(b)
result = cv2.merge((b_p, g_p, r_p))#合并处理后的三个波段
return np.uint8(result)
from osgeo import gdal
from osgeo import gdal_array
#matplotlib inline
#下面的部分都是读取遥感图像和显示的部分,与拉伸无关
filename = 'tiffbigcut.tif'
dataset = gdal.Open(filename)
datatype = dataset.GetRasterBand(1).DataType
image = np.zeros((dataset.RasterYSize, dataset.RasterXSize, dataset.RasterCount), dtype = gdal_array.GDALTypeCodeToNumericTypeCode(datatype))
for b in range(dataset.RasterCount):
band = dataset.GetRasterBand(b + 1)
image[:, :, b] = band.ReadAsArray()
result = TwoPercentLinear(image)
#plt.imshow(result)
前后的效果是显著的