那是高频噪声。您需要一个对其敏感的过滤器。
局部最大值和局部最小值之间的差异反应良好。对于你的第一张照片:
localmax = cv.dilate(pic, None, iterations=k)
localmin = cv.erode(pic, None, iterations=k)
localmax, pic, localmin
:
每张图片的差异:
diff = cv.subtract(localmax, localmin)
你看,第一个反应压倒性的。第二个也对图像的大部分区域产生反应,但不太强烈。
现在您可以计算这些差异的直方图以及累积分布:
hist, bins = np.histogram(diff.flatten(), 256, [0, 256])
cdf = hist[::-1].cumsum()[::-1]
cdf_normalized = cdf * hist.max() / cdf.max()
plt.xlim([256, 0])
plt.plot(cdf_normalized, color='r')
plt.hist(diff.flatten(), 256, [0, 256], color='b')
plt.show()
你看,如果你对差异设置一些阈值,你可以知道图片中有多少部分(至少)有那么大的噪音。在第一张图片中,即使阈值很高,仍然占据了大部分区域。显然很吵。在第二张图中,只有一小部分非常嘈杂(阈值较高),但大部分至少有一点噪声(阈值较低)。
您可以决定差异阈值的位置以及允许图片的多少部分高于阈值。
此方法还会对图像中的边缘和其他“内容”做出反应。这是不可避免的。
人们可以想出一种更可靠地基于统计的“替代”方法。第二张图片的噪声表明该图片来自模拟信号,其中包含一些低频噪声。因此,同一行中的像素相关(左/右邻居),而跨行的像素(顶部和底部的邻居)几乎不相关。