OpenCV for Android (3)——Mat

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ù)。

  • OpenCV函數(shù)中輸出圖像的內(nèi)存分配是自動完成的(如果不特別指定的話)孝凌。
  • 使用OpenCV的C++接口時(shí)不需要考慮內(nèi)存釋放問題蟀架。
  • 賦值運(yùn)算符和拷貝構(gòu)造函數(shù)( ctor )只拷貝信息頭片拍。
  • 使用函數(shù) clone() 或者 copyTo() 來拷貝一副圖像的矩陣穆碎。

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();
    }

Demo On GitHub

參考并感謝

  1. CV_8UC1,CV_8UC2,CV_8UC3
  2. OpenCv學(xué)習(xí)筆記(二)--Mat矩陣(圖像容器)的創(chuàng)建及CV_8UC1,CV_8UC2等參數(shù)詳解
  3. Mat - 基本圖像容器
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弯予,一起剝皮案震驚了整個(gè)濱河市猴贰,隨后出現(xiàn)的幾起案子对雪,更是在濱河造成了極大的恐慌栅干,老刑警劉巖碱鳞,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戒洼,死亡現(xiàn)場離奇詭異磷蜀,居然都是意外死亡歇攻,警方通過查閱死者的電腦和手機(jī)栈暇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箍镜,“玉大人源祈,你說我怎么就攤上這事∩兀” “怎么了香缺?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歇僧。 經(jīng)常有香客問我图张,道長锋拖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任祸轮,我火速辦了婚禮兽埃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘适袜。我一直安慰自己柄错,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布苦酱。 她就那樣靜靜地躺著售貌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疫萤。 梳的紋絲不亂的頭發(fā)上颂跨,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音扯饶,去河邊找鬼恒削。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尾序,可吹牛的內(nèi)容都是我干的蔓同。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蹲诀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弃揽?” 一聲冷哼從身側(cè)響起脯爪,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矿微,沒想到半個(gè)月后痕慢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌矢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年掖举,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜庇。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔次,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出名秀,到底是詐尸還是另有隱情励负,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布匕得,位于F島的核電站继榆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜略吨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一集币、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翠忠,春花似錦鞠苟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至政溃,卻和暖如春趾访,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背董虱。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工扼鞋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愤诱。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓云头,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淫半。 傳聞我的和親對象是個(gè)殘疾皇子溃槐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容