如何使用python在opencv中对噪声图像执行中值滤波

时间:2017-10-02 23:28:56

标签: python opencv image-processing computer-vision

我是OpenCV和Python的新手。我想先通过向图像添加噪声来执行高斯滤波器和中值滤波器。我已经获得了高斯滤波器的成功输出,但我无法获得中值滤波器。任何人都可以解释如何使用Python在OpenCV中对噪声图像执行中值滤波。以下是我的代码:

 import numpy as np

 import cv2

 img = cv2.imread('lizard.jpg').astype(np.float32)



 gaussian_blur = np.array([[1,2,1],[2,4,2],[1,2,1]],dtype=np.float32)
 gaussian_blur = gaussian_blur/np.sum(gaussian_blur)


 img_noise = img + np.random.uniform(-20,20,size=np.shape(img))

 cv2.imwrite('gt3_plus_noise.jpg',img_noise)
 median = cv2.medianBlur(img_noise.astype(np.float32),(3),0)
 cv2.imshow('Median Blur',median)
 cv2.waitKey()
 cv2.destroyAllWindows()
 img_blur_g = cv2.filter2D(img_noise.astype(np.float32), -1,gaussian_blur)

 cv2.imwrite('gt3_noise_filtered_gaussian.jpg',img_blur_g)

输出:

噪声滤波高斯

enter image description here

噪声图像

enter image description here

中值滤镜图片

enter image description here

2 个答案:

答案 0 :(得分:1)

OpneCV在Python和C ++中具有函数medianBlur来执行中值滤波。您可以从此处获取详细信息:http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html#medianblur

要使用此功能,请遵循以下代码段:

n=3; #where n*n is the size of filter
output_image = cv2.medianBlur(input_image, n)

答案 1 :(得分:1)

当OpenCV具有float图像时,它假定范围介于0和1之间。但是,您的图像仍然具有0到255之间的值(可能略高于此值)。这适用于操作,但为了查看图像,您需要将其标准化为0和1,,您必须转换回{{1}图像和饱和值。目前,您的图像刚刚溢出1,这是浮动图像的假定最大值。颜色仅显示在图像的较暗区域,因为值非常小;特别是,小于1。

使uint8图像的值饱和意味着0以下的任何值固定为0,255以上的任何值固定为255.正常的numpy操作不会使值饱和,它们会溢出并翻转(所以{{1} },意味着任何减去一些比特的暗值都会变亮。有关饱和度的更多信息,请参阅here

这个问题并不难解决,而且有很多解决方案。一种明确的方法是在255处简单地修复大于255的值并将小于0的值固定为0并转换为uint8图像:

np.array(-1).astype(np.uint8) ==> 255

您还可以使用cv2.convertScaleAbs()进行饱和度转换,这更简单但不那么明确:

uint8