Python过滤器去除图像中的异常值

标签 python image numpy opencv

编写CNN对图片进行分类。我遇到了垃圾像素的问题。 image生成的网络提供约 90% 的质量,似乎可以通过对这些像素进行平均来提高质量。 numpy、opencv 等中有没有现成的算法可以做到这一点?通常不是平滑,而是专门针对这些像素。还是我必须手动完成?

最佳答案

我同意,如果您使用 CNN 进行某种分类,您应该训练网络来处理这种噪声图像。也许可以用一些椒盐噪声来增强你的数据集。无论如何,这里有一个可能的解决方案来过滤掉异常值。它建立在 fmw42 提出的想法之上。步骤如下:

  1. 使用大内核应用中值模糊
  2. 将原始(未处理)图像转换为灰度
  3. (反转)阈值具有低阈值(例如 5)的灰度图像,为接近 0 的异常值创建掩码>.
  4. 使用高低阈值(例如 250)对灰度图像设置阈值,为接近 255 的异常值创建掩码。
  5. 组合两个蒙版以创建异常值蒙版
  6. 使用异常值掩码对原始输入图像进行自适应过滤,并在必要时替换中值。

让我们看看代码:

# Imports:
import cv2
import numpy as np

# image path
path = "D://opencvImages//noisyNumbers//"
fileName = "noisy01.png"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Apply median filter:
filteredImage = cv2.medianBlur(inputImage, ksize=11)

# Convert input image to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

内核大小为 11 的中值滤波如下所示:

异常值几乎消失了。现在,让我们暂时将其放在一边,计算两个异常值的一对二进制掩码:

# Get low mask:
_, lowMask = cv2.threshold(grayscaleImage, 5, 255, cv2.THRESH_BINARY_INV)

# Get high mask:
_, highMask = cv2.threshold(grayscaleImage, 250, 255, cv2.THRESH_BINARY)

# Create outliers mask:
outliersMask = cv2.add(lowMask, highMask)

异常值掩码是这样的:

现在,您确实没有提供原始数据。您提供的图像很可能是使用 matplotlib 绘制的。这是一个问题,因为您发布的图像经过处理和压缩。这会导致原始图像上的异常值周围出现一些尖锐的边缘。一个简单的解决方案是稍微扩大离群值掩模以覆盖此压缩伪影:

# Set kernel (structuring element) size:
kernelSize = 3
# Set operation iterations:
opIterations = 1
# Get the structuring element:
maxKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernelSize, kernelSize))

# Apply dilation:
outliersMask = cv2.dilate(outliersMask, maxKernel)

异常值蒙版现在如下所示:

好吧,让我们使用中值模糊图像和离群值掩模对原始输入进行自适应过滤。只需确保将所有 numpy 数组 reshape 为适合广播的大小:

# Re-shape the binary mask to a 3-channeled image:
augmentedBinary = cv2.merge([outliersMask, outliersMask, outliersMask])
# Apply the adaptive filter:
cleanedImage = np.where(augmentedBinary == (255, 255, 255), filteredImage, inputImage)

# Show the result
cv2.imshow("Adaptive Filtering", cleanedImage)
cv2.waitKey(0)

对于第一张图像,结果如下:

更多结果:

关于Python过滤器去除图像中的异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70884141/

相关文章:

python - 如何在 Python 中使用 elasticsearch 检索 1M 的文档?

ruby-on-rails-3 - 处理请求 : invalid byte sequence in UTF-8 时出现意外错误

javascript - 预加载图像,仍然闪烁

php - 图像无法显示,因为它包含错误 [Image generator]

python - 如何比较numpy多维数组的差异?

python - botocore.errorfactory.InvalidS3ObjectException

python - 尝试上传文件时“无法更改上传处理程序”

python - 在 python C 扩展中记录未知数量的 float

python - NumPy:为什么 np.linalg.eig 和 np.linalg.svd 给出不同的 SVD V 值?

python - 从 Python 中的类中打印列表