1. Mat - 基本圖像容器
從真實(shí)世界中獲取數(shù)字圖像有很多方法,比如數(shù)碼相機(jī)玄呛、掃描儀徘铝、CT或者磁共振成像惯吕。無論哪種方法废登,我們(人類)看到的是圖像郁惜,而讓數(shù)字設(shè)備來“看“的時(shí)候扳炬,則是在記錄圖像中的每一個(gè)點(diǎn)的數(shù)值。
關(guān)于 Mat 半醉,首先要知道的是你不必再手動地:
- 為其開辟空間
- 在不需要時(shí)立即將空間釋放
但手動地做還是可以的:大多數(shù)OpenCV函數(shù)仍會手動地為輸出數(shù)據(jù)開辟空間缩多。當(dāng)傳遞一個(gè)已經(jīng)存在的 Mat 對象時(shí)养晋,開辟好的矩陣空間會被重用绳泉。也就是說零酪,我們每次都使用大小正好的內(nèi)存來完成任務(wù)。
2. 存儲方法
這里講述如何存儲像素值所禀。需要指定顏色空間和數(shù)據(jù)類型色徘。顏色空間是指對一個(gè)給定的顏色操禀,如何組合顏色元素以對其編碼颓屑。最簡單的顏色空間要屬灰度級空間,只處理黑色和白色遍搞,對它們進(jìn)行組合可以產(chǎn)生不同程度的灰色溪猿。
對于彩色方式則有更多種類的顏色空間纫塌,但不論哪種方式都是把顏色分成三個(gè)或者四個(gè)基元素措左,通過組合基元素可以產(chǎn)生所有的顏色。
RGB顏色空間是最常用的一種顏色空間胸嘁,這歸功于它也是人眼內(nèi)部構(gòu)成顏色的方式钳枕。它的基色是紅色鱼炒、綠色和藍(lán)色,有時(shí)為了表示透明顏色也會加入第四個(gè)元素 alpha (A)指蚁,ARGB凝化。
有很多的顏色系統(tǒng),各有自身優(yōu)勢:
-
RGB
是最常見的酬荞,這是因?yàn)槿搜鄄捎孟嗨频墓ぷ鳈C(jī)制搓劫,它也被顯示設(shè)備所采用瞧哟。 -
HSV
和HLS把顏色分解成色調(diào)、飽和度和亮度/明度枪向。這是描述顏色更自然的方式勤揩,比如可以通過拋棄最后一個(gè)元素,使算法對輸入圖像的光照條件不敏感秘蛔。 -
YCrCb
在JPEG圖像格式中廣泛使用陨亡。 -
CIE L*a*b*
是一種在感知上均勻的顏色空間,它適合用來度量兩個(gè)顏色之間的距離 深员。
每個(gè)組成元素都有其自己的定義域负蠕,取決于其數(shù)據(jù)類型倦畅。如何存儲一個(gè)元素決定了我們在其定義域上能夠控制的精度。
最小的數(shù)據(jù)類型是 char ,占一個(gè)字節(jié)或者8位,可以是有符號型(0到255之間)或無符號型(-127到+127之間)畴椰。盡管使用三個(gè) char 型元素已經(jīng)可以表示1600萬種可能的顏色(使用RGB顏色空間)帚戳,但若使用float(4字節(jié),32位)或double(8字節(jié),64位)則能給出更加精細(xì)的顏色分辨能力鹅髓。但同時(shí)也要切記增加元素的尺寸也會增加了圖像所占的內(nèi)存空間醋粟。
3. CV_<bit_depth>(S|U|F)C<number_of_channels>
CV_<bit_depth>(S|U|F)C<number_of_channels>
- bit_depth:比特?cái)?shù)育苟,有8bite,16bites,32bites,64bites
-
S|U|F:
S:代表signed int漱竖,有符號整形
U:代表unsigned int,無符號整形
F:代表float,單精度浮點(diǎn)型 -
C<number_of_channels>:代表一張圖片的通道數(shù),
比如:
//【1】CV_8UC1---則可以創(chuàng)建----8位無符號的單通道---灰度圖片------grayImg
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
//【2】CV_8UC3---則可以創(chuàng)建----8位無符號的三通道---RGB彩色圖像---colorImg
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
//【3】CV_8UC4--則可以創(chuàng)建-----8位無符號的四通道---帶透明色的RGB圖像
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
一般的圖像文件格式使用的是Unsigned笨枯,對應(yīng)的是8bits,CvMat矩陣對應(yīng)的參數(shù)類型就是CV_8UC1,CV_8UC2称近,CV_8UC3衡未,CV_8UC4;
float 是32位的,對應(yīng)CvMat數(shù)據(jù)結(jié)構(gòu)參數(shù)就是:CV_32FC1动雹,CV_32FC2姊氓,CV_32FC3...
double是64bits,對應(yīng)CvMat數(shù)據(jù)結(jié)構(gòu)參數(shù):CV_64FC1,CV_64FC2,CV_64FC3等。
4. 在圖像中截取子圖并顯示
這里將子圖截取后轉(zhuǎn)換為灰度圖像:
public static Bitmap getRoi(Bitmap bitmap) {
Rect roi = new Rect(200, 150, 200, 300);//create a sub image with (x,y,width,height)
Bitmap roiMap = Bitmap.createBitmap(roi.width, roi.height, Bitmap.Config.ARGB_8888);
org.opencv.android.Utils.bitmapToMat(bitmap, sSrc);
Mat roiMat = sSrc.submat(roi);
Mat roiDstMat = new Mat();
Imgproc.cvtColor(roiMat, roiDstMat, Imgproc.COLOR_BGRA2GRAY);
org.opencv.android.Utils.matToBitmap(roiDstMat, roiMap);
//Don't forget to release all of this. Or it may cause OOM.
roiDstMat.release();
roiMat.release();
sSrc.release();
return roiMap;
}
5. 調(diào)整圖像亮度與對比度
public static void contrast_ratio_adjust(Bitmap bitmap) {
org.opencv.android.Utils.bitmapToMat(bitmap, sSrc);
//This operation enables you to adjust CM in a float number.
sSrc.convertTo(sSrc, CvType.CV_32F);
Mat whiteImage = new Mat(sSrc.size(), sSrc.type(), Scalar.all(1.25));//Contrast Ratio
Mat bwImage = new Mat(sSrc.size(), sSrc.type(), Scalar.all(30));//Brightness+30
Core.multiply(whiteImage, sSrc, sSrc);
Core.add(bwImage, sSrc, sSrc);
sSrc.convertTo(sSrc, CvType.CV_8U);
org.opencv.android.Utils.matToBitmap(sSrc, bitmap);
//Don't forget to release.
bwImage.release();
whiteImage.release();
sSrc.release();
}