编写CNN对图片进行分类。我遇到了垃圾像素的问题。 image生成的网络提供约 90% 的质量,似乎可以通过对这些像素进行平均来提高质量。 numpy、opencv 等中有没有现成的算法可以做到这一点?通常不是平滑,而是专门针对这些像素。还是我必须手动完成?
最佳答案
我同意,如果您使用 CNN 进行某种分类,您应该训练网络来处理这种噪声图像。也许可以用一些椒盐噪声来增强你的数据集。无论如何,这里有一个可能的解决方案来过滤掉异常值。它建立在 fmw42 提出的想法之上。步骤如下:
- 使用大内核应用中值模糊
- 将原始(未处理)图像转换为灰度
- (反转)阈值具有低阈值(例如
5
)的灰度图像,为接近0
的异常值创建掩码>. - 使用高低阈值(例如
250
)对灰度图像设置阈值,为接近255
的异常值创建掩码。 - 组合两个蒙版以创建异常值蒙版
- 使用异常值掩码对原始输入图像进行自适应过滤,并在必要时替换中值。
让我们看看代码:
# 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/