3

我正在尝试实现自定义对比度增强功能,该功能将允许我增强 QGIS 中的活动栅格图层,而无需创建新的栅格文件。

我不想做 MinMaxEnhancement 或使用任何其他现有的增强方法,我想使用一个自定义函数,它使用平均统计量以及最小值、最大值。

到目前为止,这是我的代码(顺便说一句,我在插件中执行此操作):

layer = self.iface.activeLayer()

provider = layer.dataProvider()
renderer = layer.renderer()

for band_no in range(1, 4):

    stats = provider.bandStatistics(band_no, stats=QgsRasterBandStats.All, sampleSize=0)
    band_type = renderer.dataType(band_no)
    enhancement = QgsContrastEnhancement(band_type)
    enhancement.setContrastEnhancementAlgorithm(QgsContrastEnhancement.UserDefinedEnhancement)
            
    function = CustomFunction(band_type, stats.minimumValue, stats.maximumValue, stats.mean)
    enhancement.setContrastEnhancementFunction(function)

    value = enhancement.enhanceContrast(20)
    self.iface.messageBar().pushMessage("Success", f'band: {band_no} value: {value}', level=Qgis.Success, duration=3)

    if band_no == 1:
        renderer.setRedContrastEnhancement(enhancement)
    elif band_no == 2:
        renderer.setGreenContrastEnhancement(enhancement)
    else:
        renderer.setBlueContrastEnhancement(enhancement)

layer.triggerRepaint()

还有我的 CustomFunction(我返回一个固定值50用于测试目的,将来我计划用一个使用每个栅格波段的最小值、最大值和平均统计数据的函数来替换它):

class CustomFunction(QgsContrastEnhancementFunction):

    def __init__(self, data_type, min_value: float, max_value: float, mean: float):
        super().__init__(data_type, min_value, max_value)

        self.mean = mean
        self.setMinimumValue(min_value)
        self.setMaximumValue(max_value)

    def enhance(self, value: float) -> int:

        return 50

返回的值enhanceContrast(20)符合50预期。但是,图层消失了,就好像它已被关闭一样,我希望该图层具有平坦的颜色,每个像素的值为 50。

老实说,我找不到有关该setContrastEnhancementFunction方法的任何示例或大量文档,因此我可能会错误地使用它。

4

0 回答 0