從零學習openCV opecv操作畫素

2021-09-07 05:38:46 字數 2113 閱讀 8111

1. 訪問畫素值

在opencv中能夠直接對cv::mat型別的影象呼叫at函式讀取或賦值某個畫素,我們用個簡單的案例來說明:

//在一張影象上增加椒鹽雜訊,image為輸入影象。n為噪點個數

void salt(mat &image, int n)

//彩色影象有三個通道,畫素訪問型別為cv::vec3b,即由三個uchar組成的向量。這裡用下標[i]訪問每乙個通道

else}}

效果例如以下:

能夠看到有非常多白色的雜訊點,像雪花一樣^_^

2. 指標遍歷影象

我們用顏色縮減函式來說明用行首位址的方式遍歷整個影象的畫素。顏色縮減就是將每乙個通道的顏色數減少,假設每乙個通道的強度都是有unsigned char表示。那麼就有256*256*256個顏色數目,假設將每乙個通道的顏色數減少為原先的1/8,那個總顏色數就是32*32*32。大概就是這個意思。

//顏色縮減函式,image為輸入影象。div為縮減的倍數

void colorreduce(mat&image, int div = 64)

for(int j =0;j(j);

//遍歷每行的畫素

for(int i =0;i

當然opencv還有更為底層的指標。在cv::mat中。影象資料以unsigned char形式儲存在一塊記憶體中。

//獲得影象指標

uchar *data = image.data;

//獲得第j行,第i列個畫素值,step代表影象的行寬(包含填補畫素)

data = image.data + j*image.step + i*image.elemsize();

3. 迭代器遍歷影象事實上說到遍歷。非常多人都會想到用迭代器來實現,迭代器是一種特殊的類。專門用來遍歷集合中的各個元素,opencv相同為cv::mat提供了與stl迭代器相容的迭代器,以下我們還是用顏色縮減為例說明迭代器的使用:

//顏色縮減函式。image為輸入影象。div為縮減的倍數

void colorreduce(mat&image, int div = 64)

}

效果與用指標遍歷的一樣。

4. 以上四種訪問畫素方式效率對照

opencv中能夠用gettickcount()來測量一段**的執行時間,此函式返回從上次開機算起的時鐘週期數,gettickfrequency()能夠得到每秒內的時鐘週期數,有這兩個函式就能得到隨意一段**的執行時間了。

我們還是以顏色衰減函式為例,分別用以上四種方法遍歷實現。看看執行時間有何不同:

//at方法

void colorreduce1(mat&image, int div = 64)

}}//行首指標方法

void colorreduce2(mat&image, int div = 64)

}//測試4種畫素遍歷方式執行時間

void calruntime(int v,mat&image)

}duration = static_cast(gettickcount()) - duration;

duration /= gettickfrequency()/100; //執行時間,以ms為單位

qdebug()<

可見用at的方式讀取畫素效率最低,用迭代器速度也比較慢。效率最高的方式還是使用指標讀取。

好了,本篇就到此結束吧。過兩天繼續更^_^

參考書籍

《opencv2計算機視覺程式設計手冊》

shawn-ht

未經同意請勿用於商業用途)

node js 從零學習(4)

之前已經介紹了 http url 部分基礎內容 這次進行介紹 查詢字串的相關基礎 const querystring require querystring querystring.escape str querystring.unescape str 兩個方法 簡單講就是編碼解碼 官方解釋quer...

從零學習 CA 系列

近期由於專案需要,開始轉向 ca 證書相關的知識惡補中,都很少寫日誌了。廢話少說,進入正題,本人之前沒有接觸過加密,也就更沒有接觸過 認證相關的知識,如下內容為學習過程中個人體會。數字證書通常可分為兩大類,根據證書持有者分類和根據金鑰分類。根據證書持有者是否為 ca 進行分類 根據證書持有者是否為 ...

從零學習Swift 2

定義let 定義常量,一經賦值不允許再修改 var 定義變數,賦值之後仍然可以修改 常量 定義常量並且直接設定數值 let x 20 常量數值一經設定,不能修改,以下 會報錯 x 30 使用 型別 僅僅只定義型別,而沒有設定數值 let x1 int 常量有一次設定數值的機會,以下 沒有問題,因為 ...