代码之家  ›  专栏  ›  技术社区  ›  ViktorG

应用treshold后删除图像中的异常值

  •  0
  • ViktorG  · 技术社区  · 6 年前

    就这么定了。我想创建一个蒙版来可视化两个图像之间的所有更改(geotiff被转换为2dnumpy数组)。

    为此,我只需减去像素值,并对减法的绝对值进行规格化:

    Formula

    由于结果将被噪声覆盖,因此我使用treshold并移除值低于某个限制的所有像素。

    def treshold(array, thresholdLimit):
          print("Treshold...")
          result = (array > thresholdLimit) * array
          return result
    

    这工作没有问题。现在问题来了。应用treshold时,异常值仍然存在,这不是有意的:

    enter image description here

    去除这些异常值的好方法是什么? 有时离群点是一小块像素,比如5-6个像素加在一起,如何去除这些?

    另外,我使用的图像大约是10000x1000像素。

    我很感激你的建议!

    编辑:

    这里的区别是,一张图片显示云层覆盖,另一张没有云层。 右上角明亮的蛇钩线是被云层覆盖的河流的一部分。由于像海洋或河流这样的水体在这些图像中被描绘成黑色,明亮的云层和黑暗的河流之间的差异导致河流呈现出高度的变化。

    enter image description here enter image description here

    减法结果: enter image description here

    我还尝试通过使用中值滤波器平滑tresholding的结果,但结果仍然被异常值覆盖:

    from scipy.ndimage import median_filter
    
    def filter(array, limit):
            print("Median-Filter...")
            filteredImg = np.array(median_filter(array, size=limit)).astype(np.float32)
            return filteredImg
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Florian Drawitsch    6 年前

    1. 在继续之前,请仔细检查两个图像是否为100% registered . 检查是否应使用不同的颜色通道覆盖它们。即使是最小的注册错误也会导致任务无法完成
    2. standard implementations . 使用过滤器参数,在平滑度(或源图像1的颗粒度降低)和分辨率之间找到可接受的折衷方案
    3. histogram normalization ,使用图像2的直方图作为图像1的直方图的目标。为此,您还可以使用 OpenCV implementation
    4. 减去图像
    5. 如果仍然观察到明显的噪声,请查看减法结果的直方图,看看是否可以将噪声与强度异常值联系起来。如果可以根据强度清晰地分离信号和噪声,请再次应用阈值(由直方图通知)。或者(或者另外),如果噪声在结构上与信号不同(例如,聚集),您可以查看 morphological operations