數學之路-python計算實戰(7)-機器視覺-映像產生加性零均值高斯雜訊,-python均值
映像產生加性零均值高斯雜訊,在灰階圖上加上雜訊,加上雜訊的方式是每個點的灰階值加上一個雜訊值,雜訊值的產生方式為Box-Muller演算法產生高斯雜訊。
在電腦類比中,經常需要產生常態分佈的數值。最基本的一個方法是使用標準的正態累積分布函數的反函數。除此之外還有其他更加高效的方法,Box-Muller變換就是其中之一。另一個更加快捷的方法是ziggurat演算法。下面將介紹這兩種方法。一個簡單可行的並且容易編程的方法是:求12個在(0,1)上均勻分布的和,然後減6(12的一半)。這種方法可以用在很多應用中。這12個數的和是Irwin-Hall分布;選擇一個方差12。這個隨即推導的結果限制在(-6,6)之間,並且密度為12,是用11次多項式估計常態分佈。
Box-Muller方法是以兩組獨立的隨機數U和V,這兩組數在(0,1]上均勻分布,用U和V產生兩組獨立的標準常態分布隨機變數X和Y:
-
。
這個方程的提出是因為二自由度的卡方分布很容易由指數隨機變數(方程中的lnU)產生。因而通過隨機變數V可以選擇一個均勻環繞圓圈的角度,用指數分布選擇半徑然後變換成(常態分佈的)x,y座標。
Box-Muller 是產生隨機數的一種方法。Box-Muller 演算法隱含的原理非常深奧,但結果卻是相當簡單。它一般是要得到服從常態分佈的隨機數,基本思想是先得到服從均勻分布的隨機數再將服從均勻分布的隨機數轉變為服從常態分佈。
# -*- coding: utf-8 -*- #加性零均值高斯雜訊#code:myhaspl@myhaspl.comimport cv2import numpy as npfn="test2.jpg"myimg=cv2.imread(fn)img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)param=30#灰階範圍grayscale=256w=img.shape[1]h=img.shape[0]newimg=np.zeros((h,w),np.uint8)for x in xrange(0,h): for y in xrange(0,w,2): r1=np.random.random_sample() r2=np.random.random_sample() z1=param*np.cos(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) z2=param*np.sin(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) fxy=int(img[x,y]+z1) fxy1=int(img[x,y+1]+z2) #f(x,y) if fxy<0: fxy_val=0 elif fxy>grayscale-1: fxy_val=grayscale-1 else: fxy_val=fxy #f(x,y+1) if fxy1<0: fxy1_val=0 elif fxy1>grayscale-1: fxy1_val=grayscale-1 else: fxy1_val=fxy1 newimg[x,y]=fxy_val newimg[x,y+1]=fxy1_val cv2.imshow('preview',newimg)cv2.waitKey()cv2.destroyAllWindows()
本部落格所有內容是原創,如果轉載請註明來源http://blog.csdn.net/myhaspl/下面部分代碼為彩色映像的高斯雜訊產生
# -*- coding: utf-8 -*- #加性零均值高斯雜訊#code:myhaspl@myhaspl.comimport cv2import numpy as npfn="test2.jpg"myimg=cv2.imread(fn)img=myimgparam=30#灰階範圍grayscale=256w=img.shape[1]h=img.shape[0]newimg=np.zeros((h,w,3),np.uint8)for x in xrange(0,h): for y in xrange(0,w,2): r1=np.random.random_sample() r2=np.random.random_sample() z1=param*np.cos(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) z2=param*np.sin(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) .................. newimg[x,y,0]=fxy_val_0 newimg[x,y,1]=fxy_val_1 newimg[x,y,2]=fxy_val_2 newimg[x,y+1,0]=fxy1_val_0 newimg[x,y+1,1]=fxy1_val_1 newimg[x,y+1,2]=fxy1_val_2cv2.imshow('preview',newimg)cv2.waitKey()cv2.destroyAllWindows()
在matlab上,怎給這個圖片加高斯雜訊,加入的是均值為0、方差0008的高斯雜訊 實在不會呀
clc
clear all
close all
A = imread('cameraman.tif'); % 讀入映像
imshow(A);title('原圖');
V=0.008;
Noisy=imnoise(A,‘gaussian’,0,V);
figure1;
imshow(Noisy);%添加均值為0、方差0.008的高斯雜訊
y_mask = [-1 -1 -1;0 0 0;1 1 1]; % 建立Y方向的模板
x_mask = y_mask'; % 建立X方向的模板
I = im2double(A); % 將映像資料轉化為雙精確度
dx = imfilter(I, x_mask); % 計算X方向的梯度分量
dy = imfilter(I, y_mask); % 計算Y方向的梯度分量
grad = sqrt(dx.*dx + dy.*dy); % 計算梯度
grad = mat2gray(grad); % 將梯度矩陣轉換為灰階映像
level = graythresh(grad); % 計算灰階閾值
BW = im2bw(grad,level); % 用閾值分割梯度映像
figure, imshow(BW); % 顯示分割後的映像即邊緣映像
title('Prewitt')
就是這樣了。
用matlab作出x(k)=sin(2πk)的映像,並加入零均值方差為1的高斯白色雜訊,並顯示
% 設定採樣區間
k=(0:300)'/100;
% 計算採樣值
x=sin(2*pi*k);
% 施加高斯白色雜訊
y=awgn(x,0);
figure(1);
% 設定繪圖位置,左下角距螢幕左200像素,下200像素,寬800像素,高300像素
set(gcf,'Position',[200,200,800,300]);
% 繪圖網格1*2,左圖繪製原始訊號,右圖繪製雜訊訊號
subplot(1,2,1),plot(k,x);
subplot(1,2,2),plot(k,y);