【算法源代码】计算形态学建筑物指数MBI、阴影指数MSI(源代码)

MBI:Morphological Building Index 形态学建筑物指数
MSI:Morphological Shadow Index 形态学阴影指数

python代码

import numpy as np
from osgeo import gdal
from skimage.morphology import black_tophat, square, white_tophat
from skimage.transform import rotate


def grayscale_raster_creation(input_MSfile, output_filename):
"""
This function creates a grayscale brightness image from an input image to be used for MBI calculation. For every pixel
in the input image, the intensity values from the red, green, blue channels are first obtained, and the maximum of these values
are then assigned as the pixel's intensity value, which would give the grayscale brightness image as mentioned earlier, as per
standard practice in the remote sensing academia and industry. It is assumed that the first three channels of the input image
correspond to the red, green and blue channels, irrespective of order.

Inputs:
- input_MSfile: File path of the input image that needs to be converted to grayscale brightness image
- output_filename: File path of the grayscale brightness image that is to be written to file

Outputs:
- gray: Numpy array of grayscale brightness image of corresponding multi - channel input image

"""

	image = np.transpose(gdal.Open(input_MSfile).ReadAsArray(), [1, 2, 0])
	gray = np.zeros((int(image.shape[0]), int(image.shape[1])))

for i in range(image.shape[0]):
	for j in range(image.shape[1]):
		gray[i, j] = max(image[i, j, 0], image[i, j, 1], image[i, j, 2])
		
		input_dataset = gdal.Open(input_MSfile)
		input_band = input_dataset.GetRasterBand(1)
		gtiff_driver = gdal.GetDriverByName('GTiff')
		output_dataset = gtiff_driver.Create(output_filename, input_band.XSize, input_band.YSize, 1, gdal.GDT_Float32)
		output_dataset.SetProjection(input_dataset.GetProjection())
		output_dataset.SetGeoTransform(input_dataset.GetGeoTransform())
		output_dataset.GetRasterBand(1).WriteArray(gray)
		
		output_dataset.FlushCache()
		del output_dataset

return gray


def MBI_MSI_calculation_and_feature_map_creation(input_grayfile, output_MBIname, output_MSIname, s_min, s_max, delta_s,
calc_MSI=False, write_MBI=True, write_MSI=False):
"""
This function is used to calculate the Morphological Building Index (MBI) as proposed in the paper 'Morphological
Building - Shadow Index for Building Extraction From High - Resolution Imagery Over Urban Areas'

Inputs:
- input_grayfile: String or path of grayscale tif file to be used.
- output_MBIname: String or path of MBI feature map to be written.
- output_MSIname: String or path of MSI feature map to be written.
- s_min: Minimum scale size to be used. (must be greater than or equal to 3).
- s_max: Maximum scale size to be used.
- delta_s: Spatial increment for scale size
- calc_MS: Boolean indicating whether to calculate MSI.
- write_MBI: Boolean indicating whether to write MBI feature map to file.
- write_MSI: Boolean indicating whether to write MSI feature map to file.

Outputs:
- MBI: MBI feature map for input grayscale image.
- MSI (optional): MSI feature map for input grayscale image.

"""

if s_min < 3:
	raise ValueError('s_min must be greater than or equal to 3.')
	
	gray = gdal.Open(input_grayfile).ReadAsArray()
	MP_MBI_list = []
	MP_MSI_list = []
	DMP_MBI_list = []
	DMP_MSI_list = []

for i in range(s_min, s_max + 1, 2 * delta_s):
	SE_intermediate = square(i)
	SE_intermediate[: int((i - 1) / 2), :] = 0
	SE_intermediate[int(((i - 1) / 2) + 1):, :] = 0

	SE_1 = SE_intermediate
	SE_2 = rotate(SE_1, 45, order=0, preserve_range=True).astype('uint8')
	SE_3 = rotate(SE_1, 90, order=0, preserve_range=True).astype('uint8')
	SE_4 = rotate(SE_1, 135, order=0, preserve_range=True).astype('uint8')
	
	MP_MBI_1 = white_tophat(gray, selem=SE_1)
	MP_MBI_2 = white_tophat(gray, selem=SE_2)
	MP_MBI_3 = white_tophat(gray, selem=SE_3)
	MP_MBI_4 = white_tophat(gray, selem=SE_4)

if calc_MSI:
	MP_MSI_1 = black_tophat(gray, selem=SE_1)
	MP_MSI_2 = black_tophat(gray, selem=SE_2)
	MP_MSI_3 = black_tophat(gray, selem=SE_3)
	MP_MSI_4 = black_tophat(gray, selem=SE_4)

	MP_MSI_list.append(MP_MSI_1)
	MP_MSI_list.append(MP_MSI_2)
	MP_MSI_list.append(MP_MSI_3)
	MP_MSI_list.append(MP_MSI_4)
	
	MP_MBI_list.append(MP_MBI_1)
	MP_MBI_list.append(MP_MBI_2)
	MP_MBI_list.append(MP_MBI_3)
	MP_MBI_list.append(MP_MBI_4)

for j in range(4, len(MP_MBI_list), 1):
	DMP_MBI_1 = np.absolute(MP_MBI_list[j] - MP_MBI_list[j - 4])
	DMP_MBI_list.append(DMP_MBI_1)

if calc_MSI:
	DMP_MSI_1 = np.absolute(MP_MSI_list[j] - MP_MSI_list[j - 4])
	DMP_MSI_list.append(DMP_MSI_1)
	
	MBI = np.sum(DMP_MBI_list, axis=0) / (4 * (((s_max - s_min) / delta_s) + 1))

if calc_MSI:
	MSI = np.sum(DMP_MSI_list, axis=0) / (4 * (((s_max - s_min) / delta_s) + 1))

if write_MBI:
	input_dataset = gdal.Open(input_grayfile)
	input_band = input_dataset.GetRasterBand(1)
	gtiff_driver = gdal.GetDriverByName('GTiff')
	output_dataset = gtiff_driver.Create(output_MBIname, input_band.XSize, input_band.YSize, 1, gdal.GDT_Float32)
	output_dataset.SetProjection(input_dataset.GetProjection())
	output_dataset.SetGeoTransform(input_dataset.GetGeoTransform())
	output_dataset.GetRasterBand(1).WriteArray(MBI)
	
	output_dataset.FlushCache()
	del output_dataset

if write_MSI:
	input_dataset_2 = gdal.Open(input_grayfile)
	input_band_2 = input_dataset_2.GetRasterBand(1)
	gtiff_driver_2 = gdal.GetDriverByName('GTiff')
	output_dataset_2 = gtiff_driver_2.Create(output_MSIname, input_band_2.XSize, input_band_2.YSize, 1,
	gdal.GDT_Float32)
	output_dataset_2.SetProjection(input_dataset_2.GetProjection())
	output_dataset_2.SetGeoTransform(input_dataset_2.GetGeoTransform())
	output_dataset_2.GetRasterBand(1).WriteArray(MSI)

output_dataset_2.FlushCache()
del output_dataset_2

if calc_MSI:
	return MBI, MSI
else:
	return MBI


CITE:

Huang Xin, and Zhang Liangpei. Morphological building/shadow index for
building extraction from high-resolution imagery over urban areas.
IEEE Journal of Selected Topics in Applied Earth Observations and
Remote Sensing, 2012, 5(1): 161-172.
(提出的MBI/MSI指数被国内外研究/项目广泛应用,被引190次)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银河系渐入佳境编程指南

我知道你最好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值