pyQGIS 自定义对比度增强功能

问题描述

我正在尝试实现一个自定义对比度增强功能,该功能将允许我增强 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 方法的任何示例或大量文档,因此我可能会错误地使用它。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)