2014-07-04 96 views
0

這是我的問題:我試圖創建一個簡單的程序,它將高斯噪聲添加到輸入圖像。唯一的限制是,該輸入圖像是類型CV_64F的(即雙),值是與0和1OpenCV - 高斯噪聲

我寫的代碼之間必須保持歸一化在下列:

Mat my_noise; 
my_ noise = Mat (input.size(), input.type()); 

randn(noise, 0, 5); //mean and variance 

input += noise; 

的上面的代碼不起作用,結果圖像不能正確顯示。我認爲這是因爲它超出了0,1範圍。我修改了這樣的代碼:

Mat my_noise; 
my_ noise = Mat (input.size(), input.type()); 

randn(noise, 0, 5); //mean and variance 

input += noise; 

normalize(input, input, 0.0, 1.0, CV_MINMAX, CV_64F); 

但它仍然不起作用。同樣,生成的圖像不能正確顯示。哪裏有問題?記住:輸入圖像的類型是CV_64F,並且在添加噪聲之前將值在0和1之間標準化,並且在噪聲添加之後必須保持原樣。

預先感謝您。

回答

3

你的問題是高斯噪聲可以有任意的幅度,不能用[0,1]表示。添加噪聲後重新歸一化是一個錯誤,因爲只有一個較大的噪聲值會影響整個圖像。

可能您需要做的是飽和添加噪聲時的圖像,大於1.0的值被鉗位到1.0,小於0.0的值被鉗位到0.0。

喜歡的東西

cv::Mat noise(input.size(), input.type()); 
cv::randn(noise, 0, 5); //mean and variance 
input += noise; 

cv::Mat clamp_1 = cv::Mat::ones(input.size(), input.type()); 
cv::Mat clamp_0 = cv::Mat::zeros(input.size(), input.type()); 
input = cv::max(input, clamp_0); 
input = cv::min(input, clamp_1); 

另外的5噪聲方差是非常大的,這意味着有大約92%的機會input + noise將是範圍外[0,1],假設輸入在[0,1]上均勻分佈。所以你的飽和圖像大多是黑白的,輸入圖像對結果影響不大。

+0

非常感謝您的幫助。你的代碼工作,我只需要對彩色圖像進行一些小調整。我沒有使用clamp_1和clamp_0,而是將其改爲: input = cv :: max(input,0); input = cv :: min(input,1); ,因爲當第二個參數是標量時,最小和最大比較是按每個通道完成的。 我不確定我的第一部分解釋是否正確,對不起。如果我們試圖限制高斯(例如在0,1中),我們不再從高斯分佈中獲取隨機數。另一方面,爲什麼我們不能在添加噪聲後對結果進行歸一化? – user3438376

+0

實際上,通過將方差改變爲更小的值,如果我使用我在第一篇文章(具有規格化線的文章)中編寫的代碼的第二版本,則圖像實際上會顯示,只是它看起來更暗。怎麼了? – user3438376

+0

@ user3438376認爲你有一個像素只有4個像素= [1 0.8 0.0 0.2]。現在假設我們將噪聲添加到圖像中的一個像素,因此它是[1 2 0.4 0.2]。然後,當圖像標準化時,你會得到[0.5 1 0.2 0.1],圖像較暗。很顯然,這是一個有人設想的案例,它更容易讓圖片變得更輕。將會發生什麼將很大程度上取決於圖像是什麼 - 輕微的圖像會變得更暗,而黑色的圖像會變得更輕。 – Bull