国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

圖像處理之每日一練:噪聲的添加和過濾

2019-11-11 03:23:11
字體:
供稿:網(wǎng)友

總結(jié)學(xué)習(xí)下圖像處理方面基礎(chǔ)知識(shí)。

這是第一篇,簡單的介紹下使用OpenCV的三個(gè)基本功能:

圖像的讀取圖像的顯示訪問圖像的像素值

然后概述下圖像噪聲的類型,并為圖像添加兩種常見的噪聲:高斯噪聲和椒鹽噪聲。 最后,使用中值濾波和均值濾波來處理帶有噪聲的圖像。

OpenCV基礎(chǔ)

在OpenCV中,完成圖像的輸入輸出以及顯示,只需要以下幾個(gè)函數(shù):

namedWindow 創(chuàng)建一個(gè)可以通過其名字引用的窗口。第一個(gè)參數(shù),設(shè)置窗口的name,可以通過name引用該窗口;第二個(gè)參數(shù),設(shè)置窗口的大小。有以下幾個(gè)選擇: - WINDOW_NORMAL or WINDOW_AUTOSIZE 調(diào)整窗口的大小以適應(yīng)圖像,不同的是,使用WINDOW_NORMAL可以手動(dòng)調(diào)整窗口的大小;WINDOW_AUTOSIZE不能調(diào)整窗口的大小。 - WINDOW_FREERATIO or WINDOW_KEEPRATIO 改變窗口時(shí)是否會(huì)保持圖像的ratio不變,沒發(fā)現(xiàn)這倆有什么區(qū)別。

imshow顯示圖像

imread 讀取圖像數(shù)據(jù)到Mat中,第一個(gè)參數(shù)是圖像的文件名;第二個(gè)參數(shù)是標(biāo)志,標(biāo)識(shí)怎么處理圖像的色彩。常用的幾個(gè)選項(xiàng): - IMREAD_UNCHANGED 和原圖像保持一直不變 - IMREAD_GRAYSCALE 將圖像轉(zhuǎn)換為單通道的灰度圖 - IMREAD_COLOR 將圖像轉(zhuǎn)換為3通道的BGR,默認(rèn)選項(xiàng) - IMREAD_REDUCED_GRAYSCALE_2 IMREAD_REDUCED_GRAYSCALE_4 IMREAD_REDUCED_GRAYSCALE_8 單通道灰度圖讀入圖像,并減小圖像的大小。減小的值為1/2,1/4,1/8 - IMREAD_REDUCED_COLOR_2 IMREAD_REDUCED_COLOR_4 IMREAD_REDUCED_COLOR_2 3通道BGR讀入圖像,并減小圖像的大小。減小的值為1/2,1/4,1/8

Mat是OpenCV中最重要的數(shù)據(jù)結(jié)構(gòu),在做圖像處理時(shí)基本都是對(duì)該結(jié)構(gòu)體的操作。Mat由兩部分構(gòu)成:矩陣頭矩陣數(shù)據(jù),矩陣頭較小,創(chuàng)建的每個(gè)Mat實(shí)例都擁有一個(gè)矩陣頭,而矩陣數(shù)據(jù)通常占有較大的空間,OpenCV中通過引用計(jì)數(shù)來管理這部分內(nèi)存空間,當(dāng)調(diào)用賦值運(yùn)算符和拷貝構(gòu)造函數(shù)時(shí),并不會(huì)只復(fù)制矩陣頭,并不會(huì)復(fù)制矩陣數(shù)據(jù),只是將其的引用計(jì)數(shù)加1.例如:

Mat m = imread("img.jpg");Mat a = m; // 賦值運(yùn)算符Mat b(m); // 拷貝構(gòu)造函數(shù)

上面代碼中的a,bm各自擁有自己的矩陣頭,其引用的數(shù)據(jù)卻指向同一份。也就是說,修改了其中任意一個(gè),都會(huì)影響到其余的兩個(gè)。

要想復(fù)制矩陣數(shù)據(jù),可以調(diào)用clonecopyTo這兩個(gè)函數(shù)

Mat m = imread("img.jpg");Mat f = m.clone();Mat g ;m.copyTo(g);

將圖像讀入到Mat后,有三種方式訪問Mat中的數(shù)據(jù): - 通過指針 - 使用迭代器 - 調(diào)用at

圖像噪聲

圖像噪聲是圖像在獲取或傳輸?shù)倪^程中受到隨機(jī)信號(hào)的干擾,在圖像上出現(xiàn)的一些隨機(jī)的、離散的、孤立的像素點(diǎn),這些點(diǎn)會(huì)干擾人眼對(duì)圖像信息的分析。圖像的噪聲通常是比較復(fù)雜的,很多時(shí)候?qū)⑵淇闯墒嵌嗑S隨機(jī)過程,因而可以借助于隨即過程描述噪聲,即使用概率分布函數(shù)和概率密度函數(shù)。

圖像的噪聲很多,性質(zhì)也千差萬別, 可以通過不同的方法給噪聲分類。 按照產(chǎn)生的原因:

外部噪聲內(nèi)部噪聲

這種分類方法,有助于理解噪聲產(chǎn)生的源頭,但對(duì)于降噪算法只能起到原理上的幫組。

噪聲和圖像信號(hào)的關(guān)系,可以分為:

加性噪聲,加性噪聲和圖像信號(hào)強(qiáng)度不相關(guān),這類噪聲可以看著理想無噪聲圖像f和噪聲的和。乘性噪聲,乘性噪聲和圖像信號(hào)是相關(guān)的,往往隨圖像信號(hào)的變化而變化。

而為了分析處理的方便,常常將乘性噪聲近似認(rèn)為是加性噪聲,而且總是假定信號(hào)和噪聲是互相獨(dú)立的。

最重要的來了,按照概率密度函數(shù)(PDF)分類:

高斯噪聲,高斯噪聲模型經(jīng)常被用于實(shí)踐中。脈沖噪聲(椒鹽噪聲),圖像上一個(gè)個(gè)點(diǎn),也可稱為散粒和尖峰噪聲。伽馬噪聲瑞利噪聲指數(shù)分布噪聲均勻分布噪聲

這種分類方法,引入了數(shù)學(xué)模型,對(duì)設(shè)計(jì)過濾算法比較有幫助。

給圖像添加噪聲

按照指定的噪聲類型,生成一個(gè)隨機(jī)數(shù),然后將這個(gè)隨機(jī)數(shù)加到源像素值上,并將得到的值所放到[0,255]區(qū)間即可。

C++11 隨機(jī)數(shù)發(fā)生器

新的隨機(jī)數(shù)生成器被抽象成了兩個(gè)部分:隨機(jī)數(shù)生成引擎和要生成的隨機(jī)數(shù)符合的分布。 隨機(jī)數(shù)引擎有三種: - linear_congruential_engine 線性同余算法 - mersenne_twister_engine 梅森旋轉(zhuǎn)算法 - subtract_with_carry_engine 帶進(jìn)位的線性同余算法

第一種最常用,而且速度比較快;第二種號(hào)稱最好的偽隨機(jī)數(shù)生成器

#include <random>std::random_device rd; // 隨機(jī)數(shù)種子std::mt19937 mt(rd()); // 隨機(jī)數(shù)引擎std::normal_distribution<> d(5,20); // 高斯分布std::map<int,int> hist;for(int n = 0; n < 10000; n ++) ++hist[std::round(d(mt))]; // 生成符合高斯分布的隨機(jī)數(shù)

添加圖像噪聲

使用C++的隨機(jī)數(shù)發(fā)生器為圖像添加兩種噪聲:椒鹽噪聲和高斯噪聲。 椒鹽噪聲是圖像中離散分布的白點(diǎn)或者黑點(diǎn),其代碼如下:

// 添加椒鹽噪聲void addSaltNoise(Mat &m, int num){ // 隨機(jī)數(shù)產(chǎn)生器 std::random_device rd; //種子 std::mt19937 gen(rd()); // 隨機(jī)數(shù)引擎 auto cols = m.cols * m.channels(); for (int i = 0; i < num; i++) { auto row = static_cast<int>(gen() % m.rows); auto col = static_cast<int>(gen() % cols); auto p = m.ptr<uchar>(row); p[col++] = 255; p[col++] = 255; p[col] = 255; }}

上述代碼中使用ptr<uchar>()獲取圖像某一行的行首指針,得到行首指針后就可以任意的訪問改行的像素值。

高斯噪聲是一種加性噪聲,為圖像添加高斯噪聲的代碼如下:

// 添加Gussia噪聲// 使用指針訪問void addGaussianNoise(Mat &m, int mu, int sigma){ // 產(chǎn)生高斯分布隨機(jī)數(shù)發(fā)生器 std::random_device rd; std::mt19937 gen(rd()); std::normal_distribution<> d(mu, sigma); auto rows = m.rows; // 行數(shù) auto cols = m.cols * m.channels(); // 列數(shù) for (int i = 0; i < rows; i++) { auto p = m.ptr<uchar>(i); // 取得行首指針 for (int j = 0; j < cols; j++) { auto tmp = p[j] + d(gen); tmp = tmp > 255 ? 255 : tmp; tmp = tmp < 0 ? 0 : tmp; p[j] = tmp; } }}

隨機(jī)產(chǎn)生符合高斯分布的隨機(jī)數(shù),然后將該值和圖像原有的像素值相加,并將得到的和壓縮到[0,255]區(qū)間內(nèi)。 這里寫圖片描述 左邊是原圖,中間的是添加高斯噪聲后的圖像,最右邊的是添加椒鹽噪聲后的圖像。

使用濾波器去除噪聲

根據(jù)噪聲類型的不同,選擇不同的濾波器過濾掉噪聲。通常,對(duì)于椒鹽噪聲,選擇中值濾波器(Median Filter),在去掉噪聲的同時(shí),不會(huì)模糊圖像;對(duì)于高斯噪聲,選擇均值濾波器(Mean Filter),能夠去掉噪聲,但會(huì)對(duì)圖像造成一定的模糊。 在OpenCV中,對(duì)應(yīng)于均值濾波器的函數(shù)是blur,該函數(shù)需要5個(gè)參數(shù),通常只設(shè)置前3個(gè)后兩個(gè)使用默認(rèn)值即可。 blur(m, m2, Size(5, 5));第一個(gè)參數(shù)是輸入的圖像,第二個(gè)參數(shù)是輸出的圖像,第三個(gè)參數(shù)是濾波器的大小,這里使用的是5×5的矩形。

對(duì)應(yīng)于中值濾波器的函數(shù)是medianBlur(m1, m3, 5);前兩個(gè)參數(shù)是輸入輸出的圖像,第三個(gè)參數(shù)是濾波器的大小,由于是選取的是中值,濾波器的大小通常是一個(gè)奇數(shù)。

下圖是對(duì)有噪聲圖像使用濾波器后的結(jié)果,中間的是原始圖像,左邊的是使用均值濾波器過濾高斯噪聲后的結(jié)果;右邊的是使用中值濾波器過濾椒鹽噪聲后的結(jié)果。可以明顯的看出,這兩種濾波器都能夠很好的去掉圖像的噪聲,但會(huì)對(duì)圖像造成一定的模糊,尤其是均值濾波器造成的模糊比較明顯。 這里寫圖片描述

總結(jié)

本文算是第一篇文章,簡單的介紹下OpenCV的基本使用;接著訪問圖像中的像素,并借助于C++11的隨機(jī)數(shù)庫,為圖像添加高斯噪聲和椒鹽噪聲;最后使用中值濾波器和均值濾波器除去圖像,并對(duì)結(jié)果進(jìn)行了對(duì)比。

以后堅(jiān)持每日對(duì)圖像處理的一些知識(shí)進(jìn)行整理。


上一篇:MATLAB 畫Line_Plot3D

下一篇:poj1004

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 潢川县| 康乐县| 平邑县| 巴里| 盐源县| 宁乡县| 乌兰浩特市| 合江县| 临汾市| 吴忠市| 玉树县| 马尔康县| 余庆县| 内黄县| 大同市| 长汀县| 乌兰县| 连江县| 泾川县| 三门县| 杭锦后旗| 贞丰县| 望都县| 义马市| 綦江县| 观塘区| 平顺县| 阜康市| 丰原市| 东兴市| 隆回县| 新建县| 玉田县| 石屏县| 双流县| 河西区| 南涧| 三河市| 疏勒县| 灵武市| 宁乡县|