數字圖像處理成長之路2:mat與通道

在opencv中,我們常常這樣用,cv::Mat image;
下面讓我們看看mat的內部。
打印image.channels,得到的會是幾呢?

答案是1,看來默認的Mat是1通道的,也就是灰度圖。
好處是:
1節省了內存
2節省了圖像處理的時間

那麼調用image = imread (“./test.jpeg”);
打印image.channels,得到的會是幾呢?
答案是3,也就是RGB888類型的圖片,不知道這是不是imread返回的默認格式。

但估計灰度圖和RGB888兩種格式圖片是opencv裏用到頻率極高的。

因此opencv在處理圖像時常常用到一個函數:
cvtColor( srcMat, src_gray, CV_BGR2GRAY );

把3通道的彩色圖轉換成1通道的灰色圖。

對於一個bgr的彩色圖像,如何分離出b,g,r呢?
opencv中有split 和 merge函數
cv::Mat channels[3];
cv::split(srcMat, channels);

藍色:channels[0] == 1通道的mat 裏面是藍色的灰度值
綠色:channels[1] == 1通道的mat 裏面是綠色的灰度值
紅色:channels[2] == 1通道的mat 裏面是紅色的灰度值

此時如果用imshow (“藍色”,channels[0]);
會看到什麼呢?
會看到一幅灰度圖片,一點藍的影子都沒有。

那如何真正顯示出藍色呢?

藍色是彩色,3通道的纔是彩色,所以藍色是3通道的彩色圖,只不過紅色和綠色通道的值是零。

cv::Mat bkground;
bkground.create(srcMat.rows, srcMat.cols, CV_8UC1);
bkground.copyTo(channels[1]);
bkground.copyTo(channels[2]);

merge (channels, 3, dstMat);
imshow (“藍色”,dstMat);
這樣便會看到藍色。

有時需要在qt上顯示opencv處理後的圖像。
QImage image;
打印image.format()的值是多少呢?
答案是0,查看文檔,表示invalid。

如果QImage image (”./test.jpeg”);
打印image.format()的值是多少呢?
答案是4,查看文檔,表示RGB32,也就是4通道。

可見對於彩色圖opencv和qt默認的通道數是不一樣的,一個是3,一個是4。
經過實驗發現,3通道比4通道在處理起來更簡單。
那如何把qt中的4通道抓換成3通道呢?
image = image.convertToFormat(QImage::Format_RGB888);

Mat tmpMat = QImage2cvMat (image);

然後對tmpMat用opencv的函數處理,
處理之後還需要用 cv::cvtColor(tmpMat, tmpMat, CV_BGR2BGRA)把3通道的tmpMat轉換成QImage默認的4通道,然後就可以在qt中正常顯示了。

下面這個文章寫的很好。
參考文章:http://blog.csdn.net/liyuanbhu/article/details/46662115

發佈了40 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章