0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

關于彩色圖像高斯反向投影基于OpenCV的C++代碼

OpenCV學堂 ? 來源:OpenCV學堂 ? 作者:OpenCV學堂 ? 2022-05-31 10:31 ? 次閱讀

彩色圖像高斯反向投影

一:介紹

圖像反向投影的最終目的是獲取ROI然后實現(xiàn)對ROI區(qū)域的標注、識別、測量等圖像處理與分析,是計算機視覺人工智能的常見方法之一。圖像反向投影通常是彩色圖像投影效果會比灰度圖像效果要好,原因在于彩色圖像帶有更多對象細節(jié)信息,在反向投影的時候更加容易判斷、而轉(zhuǎn)為灰度圖像會導致這些細節(jié)信息丟失、從而導致分割失敗。最常見的是基于圖像直方圖特征的反向投影。我們這里介紹一種跟直方圖反向投影不一樣的彩色圖像反向投影方法,通過基于高斯的概率分布公式(PDF)估算,反向投影得到對象區(qū)域,該方法也可以看做最簡單的圖像分割方法。缺點是對象顏色光照改變和尺度改變不具備不變性特征。所以需要在光照度穩(wěn)定情況下成像采集圖像數(shù)據(jù)。 在這種情況下使用的高斯概率密度公式為:

ca2d336c-e030-11ec-ba43-dac502259ad0.png

  1. 輸入模型M,對M的每個像素點(R,G,B)計算I=R+G+B r=R/I, g=G/I, b=B/I

  2. 根據(jù)得到權重比例值,計算得到對應的均值 與標準方差

  3. 對輸入圖像的每個像素點計算根據(jù)高斯公式計算P(r)與P(g)的乘積

  4. 歸一化之后輸出結果,即為最終基于高斯PDF的反向投影圖像

二:算法步驟與代碼實現(xiàn)

  1. 首先加載模型圖像與測試圖像

  2. 根據(jù)模型圖像計算得到每個通道對應的均值與標準方差參數(shù)

  3. 根據(jù)參數(shù)方差計算每個像素點的PDF值

  4. 歸一化概率分布圖像-即為反向投影圖像,顯示

  5. 根據(jù)Mask得到最終顏色模型對象分割

完整的基于OpenCV的C++代碼如下:


	
  1. #include

  2. #include

  3. #include

  4. using namespace cv;

  5. using namespace std;

  6. int main(int argc, char** argv) {

  7. // 加載模型圖像與測試圖像

  8. Mat src = imread("D:/gloomyfish/gc_test.png");

  9. Mat model = imread("D:/gloomyfish/gm.png");

  10. if (src.empty() || model.empty()) {

  11. printf("could not load image... ");

  12. return -1;

  13. }

  14. imshow("input image", src);

  15. // 對每個通道 計算高斯PDF的參數(shù)

  16. // 有一個通道不計算,是因為它可以通過1-r-g得到

  17. // 無需再計算

  18. Mat R = Mat::zeros(model.size(), CV_32FC1);

  19. Mat G = Mat::zeros(model.size(), CV_32FC1);

  20. int r = 0, g = 0, b = 0;

  21. float sum = 0;

  22. for (int row = 0; row < model.rows; row++) {

  23. uchar* current = model.ptr(row);

  24. for (int col = 0; col < model.cols; col++) {

  25. b = *current++;

  26. g = *current++;

  27. r = *current++;

  28. sum = b + g + r;

  29. R.at(row, col) = r / sum;

  30. G.at(row, col) = g / sum;

  31. }

  32. }

  33. // 計算均值與標準方差

  34. Mat mean, stddev;

  35. double mr, devr;

  36. double mg, devg;

  37. meanStdDev(R, mean, stddev);

  38. mr = mean.at(0, 0);

  39. devr = mean.at(0, 0);

  40. meanStdDev(G, mean, stddev);

  41. mg = mean.at(0, 0);

  42. devg = mean.at(0, 0);

  43. int width = src.cols;

  44. int height = src.rows;

  45. // 反向投影

  46. float pr = 0, pg = 0;

  47. Mat result = Mat::zeros(src.size(), CV_32FC1);

  48. for (int row = 0; row < height; row++) {

  49. uchar* currentRow = src.ptr(row);

  50. for (int col = 0; col < width; col++) {

  51. b = *currentRow++;

  52. g = *currentRow++;

  53. r = *currentRow++;

  54. sum = b + g + r;

  55. float red = r / sum;

  56. float green = g / sum;

  57. pr = (1 / (devr*sqrt(2 * CV_PI)))*exp(-(pow((red - mr), 2)) / (2 * pow(devr, 2)));

  58. pg = (1 / (devg*sqrt(2 * CV_PI)))*exp(-(pow((green - mg),2)) / (2 * pow(devg, 2)));

  59. sum = pr*pg;

  60. result.at(row, col) = sum;

  61. }

  62. }

  63. // 歸一化顯示高斯反向投影

  64. Mat img(src.size(), CV_8UC1);

  65. normalize(result, result, 0, 255, NORM_MINMAX);

  66. result.convertTo(img, CV_8U);

  67. Mat segmentation;

  68. src.copyTo(segmentation, img);

  69. // 顯示

  70. imshow("backprojection demo", img);

  71. imshow("segmentation demo", segmentation);

  72. waitKey(0);

  73. return 0;

  74. }

三:測試圖像與效果演示

藍色矩形框為模型,整個圖像為測試圖像

ca537e82-e030-11ec-ba43-dac502259ad0.jpg

反向投影結果

ca6bdc70-e030-11ec-ba43-dac502259ad0.jpg

分割提取結果

cab28b66-e030-11ec-ba43-dac502259ad0.jpg

四:總結

大家看了這個例子總是有點怪怪的,總會想起點什么,如果你能想起點什么的話就是GMM,高斯混合模型,高斯混合模型正是在此基礎上進一步演化而來。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像
    +關注

    關注

    2

    文章

    1078

    瀏覽量

    40345
  • 投影
    +關注

    關注

    0

    文章

    140

    瀏覽量

    24665
  • 圖像分割
    +關注

    關注

    4

    文章

    181

    瀏覽量

    17948

原文標題:彩色圖像高斯反向投影

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    高斯卷積核函數(shù)在圖像采樣中的意義

    高斯卷積核函數(shù)在圖像采樣中的意義主要體現(xiàn)在以下幾個方面: 1. 平滑處理與去噪 平滑圖像高斯卷積核函數(shù)通過其權重分布特性,即中心像素點權重最高,周圍像素點權重逐漸降低,實現(xiàn)了對
    的頭像 發(fā)表于 09-29 09:33 ?206次閱讀

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習慣與推理方式。與OpenCV的Mat對象對接方式
    的頭像 發(fā)表于 07-26 09:20 ?614次閱讀

    OpenCV圖像識別C++代碼

    的頭文件 在您的C++代碼中,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?1409次閱讀

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發(fā)表于 07-16 10:40 ?578次閱讀

    opencv-python和opencv一樣嗎

    的。以下是對OpenCVOpenCV-Python的比較: 編程語言: OpenCV是一個跨平臺的庫,支持多種編程語言,如C++、Java、Python等。而
    的頭像 發(fā)表于 07-16 10:38 ?681次閱讀

    C/C++代碼動態(tài)測試工具VectorCAST插樁功能演示#代碼動態(tài)測試 #C++

    C++代碼
    北匯信息POLELINK
    發(fā)布于 :2024年04月18日 11:57:45

    如何實現(xiàn)PIL和OpenCV之間圖像數(shù)據(jù)的轉(zhuǎn)換呢?

    PIL圖像數(shù)據(jù)格式轉(zhuǎn)換成OpenCV圖像數(shù)據(jù)格式
    的頭像 發(fā)表于 02-25 13:43 ?1088次閱讀

    基于QT5+OpenCV+OpenVINO C++的應用打包過程

    我用QT C++寫了一個YOLOv5模型推理演示應用。
    的頭像 發(fā)表于 01-26 10:17 ?1002次閱讀
    基于QT5+<b class='flag-5'>OpenCV</b>+OpenVINO <b class='flag-5'>C++</b>的應用打包過程

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?485次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    ELF 1技術貼|如何移植OpenCV

    OpenCV擁有了豐富的常用圖像處理函數(shù)庫,采用C/C++語言編寫,可以運行在Linux、Windows、Mac等操作系統(tǒng)上流暢運行,并能夠快速實現(xiàn)一系列
    的頭像 發(fā)表于 01-09 13:55 ?323次閱讀
    ELF 1技術貼|如何移植<b class='flag-5'>OpenCV</b>

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實現(xiàn)CUDA加速執(zhí)行,實現(xiàn)對OpenCV圖像處理程序的加速運行,當前支持加速的模塊包括如下。
    的頭像 發(fā)表于 12-05 09:56 ?910次閱讀
    <b class='flag-5'>OpenCV</b>4.8 CUDA編程<b class='flag-5'>代碼</b>教程

    c++多行注釋快捷鍵

    C++中,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個語句的方法。當你希望暫時禁用一些代碼或者解釋特定部分代碼的作用時,多行注釋是非常有用的。 在
    的頭像 發(fā)表于 11-22 10:24 ?7486次閱讀

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點問題,讓大家領略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?745次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖

    Ubuntu系統(tǒng)下編譯OpenCV4.8源碼記錄

    很多人經(jīng)常會問我是否有在Ubuntu系統(tǒng)化下開發(fā)OpenCV C++應用的教程,其實我一直沒有,然后我有幾塊開發(fā)板都是基于Linux的,有Jetson系列的開發(fā)板,所以我以前寫過一篇文章如何在
    的頭像 發(fā)表于 10-27 16:07 ?1483次閱讀
    Ubuntu系統(tǒng)下編譯<b class='flag-5'>OpenCV</b>4.8源碼記錄

    基于FPGA圖像處理的高斯模糊實現(xiàn)

    高斯模糊(Gaussian Blur)是一種高斯低通濾波,可以過濾掉圖像的高頻部分,保留低頻部分,對于去除高斯噪聲非常有效果,常常被用于圖像
    發(fā)表于 10-26 09:36 ?657次閱讀
    基于FPGA<b class='flag-5'>圖像</b>處理的<b class='flag-5'>高斯</b>模糊實現(xiàn)