问题描述
我正在尝试实现一个自定义对比度增强功能,该功能将允许我增强 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 (将#修改为@)