一張圖像是由很多個(gè)像素組合而成的,,因?yàn)橐粋€(gè)像素特別小,,而人眼的分辨率也是有限的,,所以我們平時(shí)看不出來,,能夠看到的只是一張光滑的圖像,。從下圖中我們可以看到,,將一張圖像的一部分放大之后,,我們會看到一個(gè)個(gè)小方塊,,這些小方塊便是一個(gè)個(gè)像素點(diǎn)了,。
現(xiàn)在知道了什么是像素點(diǎn)了,,那么像素點(diǎn)又是如何組成的呢?其實(shí)在計(jì)算機(jī)中每一種顏色都可以用 R G B 三種顏色分量來進(jìn)行合成,也就是藍(lán)綠紅,。比如黃色,,我們就可以用 255 的紅色、255 的綠色以及 0 的藍(lán)色組合而成,。
所以對于每一個(gè)像素點(diǎn)來說,,計(jì)算機(jī)存儲的實(shí)際上就是 R G B 三種顏色的值。對于一個(gè) 8 位顏色深度的圖片來說,,R G B 的每一個(gè)顏色分量的取值范圍在 0 到 255,,共 256 個(gè)值,也就是每一個(gè)通道都有 256 種顏色可取,那么對于 R G B 三通道組合成的像素點(diǎn)來說,,總共就有 256 的 3 次方種顏色可以取,,不同顏色的像素點(diǎn)共同組成了我們看到的形形色色的圖像。
到這里我們就知道了像素點(diǎn)是如何組成的,,我們再來看看我們平時(shí)所說的圖片的寬度和高度是什么吧,。對于下面的圖像,我們可以從屬性里看到,,寬度是 500 像素,,高度是 833 像素,這里的高度和寬度就是像素點(diǎn)的個(gè)數(shù),,也就是說,,這個(gè)圖像在水平方向上有 500 個(gè)像素點(diǎn),在豎直方向上有 833 個(gè)像素的,,總共有 500 * 833 個(gè)像素點(diǎn),,而每個(gè)像素點(diǎn)都有 R G B 三個(gè)值。
上面就是我們需要提前了解的關(guān)于圖像像素的一些基本知識點(diǎn),,了解了這些基本概念,,我們就可以愉快地進(jìn)行代碼編寫了,下面我們一起來看看是如何對圖像的某個(gè)或者某些像素點(diǎn)進(jìn)行讀取和寫入的操作吧,。
我們先來看看像素的讀取操作,,對于像素的讀取,我們使用的仍然是 Opencv 庫,。在讀取像素之前,,我們先要通過 imread 載入一張圖像,然后便可以對某像素點(diǎn)直接進(jìn)行讀取操作了,。比如這里我們要讀出(100,,200)位置處的像素點(diǎn)的 R G B 值。同樣,,我將使用 Python 與 C# 進(jìn)行對比展示,。先來看看 Python代碼是如何實(shí)現(xiàn)的吧!
從圖中我們可以看出,(100,,200)處的像素點(diǎn)的三通道值分別是 77,,52,2,。這里就完成了像素的讀取了,,是不是很簡單。下面我們再來看看 C# 代碼是如何實(shí)現(xiàn)的吧,。
可以看出,,最終結(jié)果是一樣的,,只是在代碼編寫上略有區(qū)別,不過也是特別簡單地實(shí)現(xiàn)了,。下面我們就來看看如何對像素進(jìn)行寫入操作的吧!像素的寫入與讀取是相反的過程,,但是同樣特別簡單,短短幾行代碼便可實(shí)現(xiàn),。下面我們來通過對像素寫入的方式畫一個(gè)方框吧,。
同樣最終結(jié)果是一樣的,只是在代碼編寫上略有不同,。