import cv2
import numpy as np
import matplotlib.pyplot as plt
import scipy
import scipy.stats
%matplotlib inline

读入我们需要的图像

apple = cv2.imread("apple.jpg")
apple = cv2.resize(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB),(200,200))
plt.imshow(apple)
plt.axis("off")
plt.show()

噪声

高斯噪声

简介

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声

与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。

椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。

正如上面的简介我们只要实现一个随机矩阵,矩阵中值总体来说符合高斯分布,与原图像想加,就可以实现高斯噪声了,python中的random提供了产生高斯随机数的方法,但是numpy提供了直接生成随机高斯矩阵的方法。

我们这里使用numpy即可

gauss = np.random.normal(mean,sigma,(row,col,ch))

因此我们可以得出产生高斯噪声的方式

def GaussieNoisy(image,sigma):
row,col,ch= image.shape
mean = 0
gauss = np.random.normal(mean,sigma,(row,col,ch))
gauss = gauss.reshape(row,col,ch)
noisy = image + gauss
return noisy.astype(np.uint8)
plt.imshow(GaussieNoisy(apple,25))
plt.show()

上图为施加sigma为25的高斯噪声的效果

椒盐噪声

相比高斯噪声,椒盐噪声的概念非常简单,即在图像中随机选点,使其为0或255

def spNoisy(image,s_vs_p = 0.5,amount = 0.004):
row,col,ch = image.shape out = np.copy(image)
num_salt = np.ceil(amount * image.size * s_vs_p)
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
out[coords] = 1
num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))
coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
out[coords] = 0
return out
plt.imshow(spNoisy(apple))
plt.show()

滤波

算术均值滤波

算术均值滤波器即求某一范围内图像的均值,代替范围中心点的值,在前面已经实现过。

def ArithmeticMeanOperator(roi):
return np.mean(roi)
def ArithmeticMeanAlogrithm(image):
new_image = np.zeros(image.shape)
image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
for i in range(1,image.shape[0]-1):
for j in range(1,image.shape[1]-1):
new_image[i-1,j-1] = ArithmeticMeanOperator(image[i-1:i+2,j-1:j+2])
new_image = (new_image-np.min(image))*(255/np.max(image))
return new_image.astype(np.uint8)
def rgbArithmeticMean(image):
r,g,b = cv2.split(image)
r = ArithmeticMeanAlogrithm(r)
g = ArithmeticMeanAlogrithm(g)
b = ArithmeticMeanAlogrithm(b)
return cv2.merge([r,g,b])
plt.imshow(rgbArithmeticMean(apple))
plt.show()

几何均值滤波

几何均值公式如下

\[f(x,y) = [\prod_{(s,t)\in S_{x,y}}{g(s,t)}]^{\frac 1{mn}}
\]

def GeometricMeanOperator(roi):
roi = roi.astype(np.float64)
p = np.prod(roi)
return p**(1/(roi.shape[0]*roi.shape[1])) def GeometricMeanAlogrithm(image):
new_image = np.zeros(image.shape)
image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
for i in range(1,image.shape[0]-1):
for j in range(1,image.shape[1]-1):
new_image[i-1,j-1] = GeometricMeanOperator(image[i-1:i+2,j-1:j+2])
new_image = (new_image-np.min(image))*(255/np.max(image))
return new_image.astype(np.uint8)
def rgbGemotriccMean(image):
r,g,b = cv2.split(image)
r = GeometricMeanAlogrithm(r)
g = GeometricMeanAlogrithm(g)
b = GeometricMeanAlogrithm(b)
return cv2.merge([r,g,b])
plt.imshow(rgbGemotriccMean(apple))
plt.show()

谐波均值

谐波均值公式定义如下

\[ H = \frac{n} {\frac{1}{x_1}+\frac{1}{x_2}+\frac{1}{x_3}\ldots \frac{1}{x_n}}
\]

这里需要注意的是,谐波均值处理的数必须大于0,当x存在为0的数是,趋近于无穷,则H=0

因此我们此处当存在x大于0的数时,就返回0

def HMeanOperator(roi):
roi = roi.astype(np.float64)
if 0 in roi:
roi = 0
else:
roi = scipy.stats.hmean(roi.reshape(-1))
return roi
def HMeanAlogrithm(image):
new_image = np.zeros(image.shape)
image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
for i in range(1,image.shape[0]-1):
for j in range(1,image.shape[1]-1):
new_image[i-1,j-1] =HMeanOperator(image[i-1:i+2,j-1:j+2])
new_image = (new_image-np.min(image))*(255/np.max(image))
return new_image.astype(np.uint8)
def rgbHMean(image):
r,g,b = cv2.split(image)
r = HMeanAlogrithm(r)
g = HMeanAlogrithm(g)
b = HMeanAlogrithm(b)
return cv2.merge([r,g,b])
plt.imshow(rgbHMean(apple))
plt.show()

逆谐波均值

公式如下

\[f(x,y) = \frac{\sum_{(s,t)\in S_{xy}}{g(s,t)^{Q+1}}} {\sum_{(s,t)\in S_{xy}}{g(s,t)^{Q}}}
\]

因此使用python实现如下

def IHMeanOperator(roi,q):
roi = roi.astype(np.float64)
return np.mean((roi)**(q+1))/np.mean((roi)**(q))
def IHMeanAlogrithm(image,q):
new_image = np.zeros(image.shape)
image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
for i in range(1,image.shape[0]-1):
for j in range(1,image.shape[1]-1):
new_image[i-1,j-1] = IHMeanOperator(image[i-1:i+2,j-1:j+2],q)
new_image = (new_image-np.min(image))*(255/np.max(image))
return new_image.astype(np.uint8)
def rgbIHMean(image,q):
r,g,b = cv2.split(image)
r = IHMeanAlogrithm(r,q)
g = IHMeanAlogrithm(g,q)
b = IHMeanAlogrithm(b,q)
return cv2.merge([r,g,b])
plt.imshow(rgbIHMean(apple,2))
plt.show()

图像的复原

下面我们将试着对加了高斯噪声和椒盐噪声的图像进行复原

spApple = spNoisy(apple,0.5,0.1)
gaussApple = GaussieNoisy(apple,25)
plt.subplot(121)
plt.title("Salt And peper Image")
plt.imshow(spApple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gaussApple)
plt.axis("off")
plt.title("Gauss noise Image")
plt.show()

arith_sp_apple = rgbArithmeticMean(spApple)
gemo_sp_apple = rgbGemotriccMean(spApple)
plt.subplot(121)
plt.title("Arithmatic to spImage")
plt.imshow(arith_sp_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_sp_apple)
plt.axis("off")
plt.title("Geomotric to spImage")
plt.show()

arith_gs_apple = rgbArithmeticMean(gaussApple)
gemo_gs_apple = rgbGemotriccMean(gaussApple)
plt.subplot(121)
plt.title("Arithmatic to gsImage")
plt.imshow(arith_gs_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_gs_apple)
plt.axis("off")
plt.title("Geomotric to gsImage")
plt.show()

算术均值能略微去除椒盐噪声产生的点,几何均值效果却有些奇怪。

对于高斯噪声,二者的效果都非常弱

arith_sp_apple = rgbHMean(spApple)
gemo_sp_apple = rgbIHMean(spApple,3)
plt.subplot(121)
plt.title("H Mean to spImage")
plt.imshow(arith_sp_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_sp_apple)
plt.axis("off")
plt.title("IH mean to spImage")
plt.show()

arith_gs_apple = rgbHMean(gaussApple)
gemo_gs_apple = rgbIHMean(gaussApple,3)
plt.subplot(121)
plt.title("HMean to gsImage")
plt.imshow(arith_gs_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_gs_apple)
plt.axis("off")
plt.title("IHMean to gsImage")
plt.show()

如图,IHMEAN的效果要比Hmean好很多,即使是高斯造神也能达到良好的去噪效果

python数字图像处理(五) 图像的退化和复原的更多相关文章

  1. python数字图像处理(17):边缘与轮廓

    在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...

  2. 「转」python数字图像处理(18):高级形态学处理

    python数字图像处理(18):高级形态学处理   形态学处理,除了最基本的膨胀.腐蚀.开/闭运算.黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等. 1.凸包 凸包是指一 ...

  3. Win8 Metro(C#) 数字图像处理--1 图像打开,保存

    原文:Win8 Metro(C#) 数字图像处理--1 图像打开,保存 作为本专栏的第一篇,必不可少的需要介绍一下图像的打开与保存,一便大家后面DEMO的制作.   Win8Metro编程中,图像相关 ...

  4. python数字图像处理(1):环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  5. 初始----python数字图像处理--:环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  6. Win8 Metro(C#)数字图像处理--4图像颜色空间描述

    原文:Win8 Metro(C#)数字图像处理--4图像颜色空间描述  图像颜色空间是图像颜色集合的数学表示,本小节将针对几种常见颜色空间做个简单介绍. /// <summary> / ...

  7. python数字图像处理(5):图像的绘制

    实际上前面我们就已经用到了图像的绘制,如: io.imshow(img) 这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据.因此,我们也可 ...

  8. python数字图像处理(11):图像自动阈值分割

    图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素 ...

  9. python数字图像处理(10):图像简单滤波

    对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声:另一种是微分算子,可以用来检测边缘和特征提取. skimage库中通过filters模块进行滤波操作. 1.sobel算子 sobel算子 ...

随机推荐

  1. Python---字符串拼接和严格字符串

    BIF内建函数 Python3中提供了多少个内置函数     68 Python3中TUling tuling是不是一样的   严格区别大小 “=”和“==”的运用与区别 - ‘=‘ 是用来赋值的 - ...

  2. iOS---如何截图,如何将图片保存到相册

    最近的项目中运用到了这两个功能,所以记录一下.做了一个小工程将两个方法结合到了一起 1 - (void)viewDidLoad { [super viewDidLoad]; UIButton * bt ...

  3. jquery easyui控件事件监听委托给jquery事件监听,keyup取最新值问题

    <div id="<?php echo NS; ?>toolbar"> <div style="padding:5px"> ...

  4. 计算一段日期内的周末天数的php代码(星期六,星期日总和)

    代码如下: /*| Author: Yang Yu <niceses@gmail.com>| @param char|int $start_date 一个有效的日期格式,例如:200910 ...

  5. [APIO2013]道路费用

    题目描述 幸福国度可以用 N 个城镇(用 1 到 N 编号)构成的集合来描述,这些城镇 最开始由 M 条双向道路(用 1 到 M 编号)连接.城镇 1 是中央城镇.保证一个 人从城镇 1 出发,经过这 ...

  6. The server time zone value 'EDT' is unrecognized or represents more than one time zone

    解决: (1)使用 server mysql start命令启动mysql (2)在mysql中执行show variables like '%time_zone%'; (3)输入select now ...

  7. Windows 下手工搭建 LNMP 环境

    参考资料 如果想方便,可以直接使用集成的 LNMP 环境(例如 PHPStudy). 下载 PHP 下载地址:https://windows.php.net/download 根据你的系统选择 32 ...

  8. Nginx 转写功能和Apache .htaccess 对应

    之前一直使用apache 服务器,现有一项目想转到Nginx 服务器运行.. 发现Apache 的撰写功能和 Nginx的不一样.无法通用.hataccess 文件 查阅网上资料,nginx 配置转写 ...

  9. WPF国际化方式1之资源文件

    先看效果吧,个人觉得由于MVVM模式的UI响应属性变化的特殊机制,资源文件和内存数据都是国际化不错的选择. 1.首先准备两个资源文件用来做中文和英文的转换使用,将程序中需要转换语言都弄成两个版本,分别 ...

  10. Mac009--Axure RP安装

    Mac--Axure RP安装 一.下载Axure RP8.0 下载网址:https://www.axure.com/download  (下载mac版本) Axure RP说明: Axure RP是 ...