图像加噪和去噪遇到的坑(opencv+skimage.util)

图像的加噪和去噪一直图像界很重要的课题,使用opencv可以很好的去加快开发速度和验证模型,然而网上的教程真的是抄来抄去,代码都是有问题的各个所谓的创和转载都是没有运行的。简直了。

首先给图像加噪音,加噪音比较简单的就是使用 skimage.util.random_noise(img, mode="salt"),然而使用该函数加完噪音后会导致使用opencv去降噪的函数会提示无法支持的格式 ! 

首先我们分析一下问题的所在

skimage.util.random_noise()

out : ndarray

Output floating-point image data on range [0, 1] or [-1, 1] if the
input `image` was unsigned or signed, respectively.

该加噪函数(方法)将图像转化[0,1]或者[-1,1],而且数据类型变成了float64类型,而opencv处理的图像格式一般是uint8类型的,因此还需要进行转化。

首先需将[0,1]转化为0-255,然后将浮点float64转为uint8的。

因为代码跑在服务器上没有图像界面,因此需要用visdom做图片的显示。附代码:

import cv2
import visdom
import numpy as np
import matplotlib.pyplot as plt
from skimage.util.dtype import convert
import skimage.util

viz = visdom.Visdom(env='img')
img = cv2.imread('qiao.jpg', 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

print(img.dtype)
# img=img.transpose(1,0,2)
# 使用一下函数进行加噪声会导致数据类型从uint8转为float64,而去噪的 函数只能处理8位的uint类型的图片
noise_img = skimage.util.random_noise(img, mode="salt")
# 将加了噪音的[0,1]之间转化为0-255
noise_img = noise_img*255

plt.figure(0)
noise_img = noise_img.astype(np.uint8)
viz.image(noise_img.transpose(2, 0, 1))
# denoise = cv2.GaussianBlur(noise_img, (5, 5), 1)
denoise = cv2.GaussianBlur(noise_img, ksize=(3, 3), sigmaX=0)
viz.image(denoise.transpose(2, 0, 1))
denoise_mean = cv2.medianBlur(noise_img, 5)
viz.image(denoise_mean.transpose(2, 0, 1))
denoise_mean = cv2.fastNlMeansDenoising(noise_img,h=30)
viz.text("均值滤波结果")
viz.image(denoise_mean.transpose(2, 0, 1))

在本地上直接使用plt。imshow()显示就可以 ,所以说代码还得自己跑才知道这代码能不能运行!!

 

你可能感兴趣的:(图像处理)