施加阈值后,移除图像中的离群值

时间:2019-01-14 17:49:36

标签: python numpy image-processing outliers

这是交易。我想创建一个遮罩,以可视化两个图像之间的所有变化(转换为2D numpy数组的GeoTiff)。

为此,我仅减去像素值并标准化减法的绝对值:

Formula

由于结果将被噪声覆盖,因此我使用阈值并删除所有值低于特定限制的像素。

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

这没有问题。现在来了问题。应用阈值时,会保留异常值,这是不希望的:

enter image description here

什么是消除这些异常值的好方法? 有时离群值是小块像素,例如5-6个像素在一起,如何将其删除?

此外,我使用的图像约为10000x10000像素。

我将不胜感激所有建议!

编辑:

两个图像都是卫星卫星图像,覆盖的区域完全相同。 此处的区别在于,一张图像显示了云的覆盖范围,而另一张图像没有云。 右上角的明亮蛇线是一条被云层覆盖的河流的一部分。由于在这些图像中,像海洋或河流这样的水体都用黑色表示,因此明亮的云层和黑暗的河流之间的差异导致河流呈现出高度的变化。

我希望以下图片能使您清楚:

来源tiffs: enter image description here enter image description here

减法结果: enter image description here

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

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 个答案:

答案 0 :(得分:0)

我建议以下内容:

  1. 在继续操作之前,请仔细检查两个图像是否均为100%registered。要检查您是否应该使用例如不同的颜色通道。即使很小的注册错误也可能使您的任务变得不可能
  2. 略微平滑两个输入图像(在减法之前)。为此,我建议您使用standard implementations。尝试使用滤镜参数,以找到在平滑度(或减少源图像1的颗粒度)和分辨率之间可以接受的折衷方案
  3. 然后尝试通过应用histogram normalization来匹配图像统计信息,将图像2的直方图用作图像1直方图的目标。为此,您也可以使用OpenCV implementation
  4. 减去图像
  5. 如果您仍然观察到明显的噪声,请查看减法结果的直方图,看看是否可以将噪声与强度离群值相关联。如果您可以根据强度清楚地区分信号和噪声,请再次应用阈值(由直方图告知)。另外(或另外),如果噪声在结构上与信号不同(例如,成簇的),则可以查看morphological operations来消除它。