我是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)
输出:
噪声滤波高斯
噪声图像
中值滤镜图片
答案 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