99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

3天內不再提示

OpenCV中積分圖函數與應用

OpenCV學堂 ? 來源:OpenCV學堂 ? 作者:OpenCV學堂 ? 2022-06-29 10:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

OpenCV中積分圖函數與應用

一:圖像積分圖概念

積分圖像是Crow在1984年首次提出,是為了在多尺度透視投影中提高渲染速度。隨后這種技術被應用到基于NCC的快速匹配、對象檢測和SURF變換中、基于統(tǒng)計學的快速濾波器等方面。積分圖像是一種在圖像中快速計算矩形區(qū)域和的方法,這種算法主要優(yōu)點是一旦積分圖像首先被計算出來我們可以計算圖像中任意大小矩形區(qū)域的和而且是在常量時間內。這樣在圖像模糊、邊緣提取、對象檢測的時候極大降低計算量、提高計算速度。第一個應用積分圖像技術的應用是在Viola-Jones的對象檢測框架中出現。

35f9e682-f6f5-11ec-ba43-dac502259ad0.jpg

36181fe4-f6f5-11ec-ba43-dac502259ad0.png

上圖左側四個點的矩形區(qū)域像素求和,只要根據每個點左上方所有像素和表值,進行兩次減法與一次加法即可=》46 – 22 – 20 + 10 = 14

二:OpenCV中積分圖函數

OpenCV中通過integral()函數可以很容易的計算圖像的積分圖,該函數支持和表積分圖、平方和表積分圖、瓦塊和表積分圖計算。integral函數與參數解釋如下:


	
  1. void cv::integral(

  2. InputArray src, // 輸入圖像

  3. OutputArray sum, // 和表

  4. OutputArray sqsum, // 平方和表

  5. OutputArray tilted, // 瓦塊和表

  6. int sdepth = -1, // 和表數據深度常見CV_32S

  7. int sqdepth = -1 // 平方和表數據深度 常見 CV_32F

  8. )

三:使用積分圖函數

通過代碼演示計算積分圖實現任意窗口大小的盒子模糊與垂直邊緣提取,完整的代碼實現如下:


	
  1. #include

  2. #include

  3. using namespace cv;

  4. using namespace std;

  5. void blur_demo(Mat &image, Mat &sum);

  6. void edge_demo(Mat &image, Mat &sum);

  7. int getblockSum(Mat &sum, int x1, int y1, int x2, int y2, int i);

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

  9. Mat src = imread("D:/vcprojects/images/yuan_test.png");

  10. if (src.empty()) {

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

  12. return -1;

  13. }

  14. namedWindow("input", CV_WINDOW_AUTOSIZE);

  15. imshow("input", src);

  16. namedWindow("output", CV_WINDOW_AUTOSIZE);

  17. // 計算積分圖

  18. Mat sum, sqrsum;

  19. integral(src, sum, sqrsum, CV_32S, CV_32F);

  20. // 積分圖應用

  21. int type = 0;

  22. while (true) {

  23. char c = waitKey(100);

  24. if (c > 0) {

  25. type = (int)c;

  26. printf("c : %d ", type);

  27. }

  28. if (c == 27) {

  29. break; // ESC

  30. }

  31. if (type == 49) { // 數字鍵 1

  32. blur_demo(src, sum);

  33. }

  34. else if (type == 50) { // 數字鍵 2

  35. edge_demo(src, sum);

  36. }

  37. else {

  38. blur_demo(src, sum);

  39. }

  40. }

  41. waitKey(0);

  42. return 0;

  43. }

  44. void blur_demo(Mat &image, Mat &sum) {

  45. int w = image.cols;

  46. int h = image.rows;

  47. Mat result = Mat::zeros(image.size(), image.type());

  48. int x2 = 0, y2 = 0;

  49. int x1 = 0, y1 = 0;

  50. int ksize = 5;

  51. int radius = ksize / 2;

  52. int ch = image.channels();

  53. int cx = 0, cy = 0;

  54. for (int row = 0; row < h + radius; row++) {

  55. y2 = (row + 1)>h ? h : (row + 1);

  56. y1 = (row - ksize) < 0 ? 0 : (row - ksize);

  57. for (int col = 0; col < w + radius; col++) {

  58. x2 = (col + 1)>w ? w : (col + 1);

  59. x1 = (col - ksize) < 0 ? 0 : (col - ksize);

  60. cx = (col - radius) < 0 ? 0 : col - radius;

  61. cy = (row - radius) < 0 ? 0 : row - radius;

  62. int num = (x2 - x1)*(y2 - y1);

  63. for (int i = 0; i < ch; i++) {

  64. // 積分圖查找和表,計算卷積

  65. int s = getblockSum(sum, x1, y1, x2, y2, i);

  66. result.at<Vec3b>(cy, cx)[i] = saturate_cast(s / num);

  67. }

  68. }

  69. }

  70. imshow("output", result);

  71. imwrite("D:/result.png", result);

  72. }

  73. /**

  74. * 3x3 sobel 垂直邊緣檢測演示

  75. */

  76. void edge_demo(Mat &image, Mat &sum) {

  77. int w = image.cols;

  78. int h = image.rows;

  79. Mat result = Mat::zeros(image.size(), CV_32SC3);

  80. int x2 = 0, y2 = 0;

  81. int x1 = 0, y1 = 0;

  82. int ksize = 3; // 算子大小,可以修改,越大邊緣效應越明顯

  83. int radius = ksize / 2;

  84. int ch = image.channels();

  85. int cx = 0, cy = 0;

  86. for (int row = 0; row < h + radius; row++) {

  87. y2 = (row + 1)>h ? h : (row + 1);

  88. y1 = (row - ksize) < 0 ? 0 : (row - ksize);

  89. for (int col = 0; col < w + radius; col++) {

  90. x2 = (col + 1)>w ? w : (col + 1);

  91. x1 = (col - ksize) < 0 ? 0 : (col - ksize);

  92. cx = (col - radius) < 0 ? 0 : col - radius;

  93. cy = (row - radius) < 0 ? 0 : row - radius;

  94. int num = (x2 - x1)*(y2 - y1);

  95. for (int i = 0; i < ch; i++) {

  96. // 積分圖查找和表,計算卷積

  97. int s1 = getblockSum(sum, x1, y1, cx, y2, i);

  98. int s2 = getblockSum(sum, cx, y1, x2, y2, i);

  99. result.at<Vec3i>(cy, cx)[i] = saturate_cast(s2 - s1);

  100. }

  101. }

  102. }

  103. Mat dst, gray;

  104. convertScaleAbs(result, dst);

  105. normalize(dst, dst, 0, 255, NORM_MINMAX);

  106. cvtColor(dst, gray, COLOR_BGR2GRAY);

  107. imshow("output", gray);

  108. imwrite("D:/edge_result.png", gray);

  109. }

  110. int getblockSum(Mat &sum, int x1, int y1, int x2, int y2, int i) {

  111. int tl = sum.at<Vec3i>(y1, x1)[i];

  112. int tr = sum.at<Vec3i>(y2, x1)[i];

  113. int bl = sum.at<Vec3i>(y1, x2)[i];

  114. int br = sum.at<Vec3i>(y2, x2)[i];

  115. int s = (br - bl - tr + tl);

  116. return s;

  117. }

這里最重要的是要注意到上面的圖示,積分圖對象的Mat(1,1)對應實際圖像Mat(0,0),如果不加處理的話會導致結果有明顯的中心遷移。edge_demo實現了積分圖查找提取圖像邊緣、blur_demo函數實現積分圖查找圖像均值模糊,getblockSum函數實現和表查找功能,運行顯示:

原圖:

模糊效果

36546d64-f6f5-11ec-ba43-dac502259ad0.jpg

邊緣效果

36721c38-f6f5-11ec-ba43-dac502259ad0.jpg

審核編輯 :李倩


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

    關注

    2

    文章

    1094

    瀏覽量

    41241
  • 函數
    +關注

    關注

    3

    文章

    4380

    瀏覽量

    64853
  • OpenCV
    +關注

    關注

    32

    文章

    642

    瀏覽量

    42878

原文標題:OpenCV中積分圖介紹與應用

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    itop-3568開發(fā)板機器視覺opencv開發(fā)手冊-圖像繪制-畫線

    demo11_line.py 然后向該文件添加以下內容: 第 1 行和第 2 行分別導入了 opencv 和 numpy 庫; 第 3 行使用 zeros()函數創(chuàng)建一個 512x512 的黑色圖片; 第 4 行使
    發(fā)表于 06-04 10:38

    在matlab如何計算含有第一類修正的貝塞爾函數積分算不出的問題?

    問題摘要: 在matlab中計算含有第一類修正的貝塞爾函數積分時,出現了在部分值能計算出結果,部分值無法計算出結果的問題。 一、變量定義: syms x y=1.0+1i*x; %積分
    發(fā)表于 05-19 16:53

    為LSDK構建opencv時遇到的問題求解

    我正在嘗試使用 flex-builder 來運行 bld -c opencv -r ubuntu:桌面 我想要最新版本的 OpenCV。在我的 sdk.yml 文件,我將 opencv
    發(fā)表于 03-26 08:26

    詳解RTOS的Hook函數

    Hook函數是RTOS的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?384次閱讀

    運算放大器積分電路分析

    的。 當輸入信號是階躍直流電壓么時,電容將以近似恒流的方式進行充電,輸出電壓與時間成線性關系。即 例:在1的積分器的輸入端加入2給定輸入波形,畫出在此輸入波形作用下
    發(fā)表于 03-11 14:36

    運放反相放大電路與積分電路反饋電阻和電容的作用

    詳細探討了運放反相放大電路與積分電路反饋電阻和電容的作用。在反相放大電路,電容主要用于穩(wěn)定電路,減少高頻干擾,而電阻是主要的放大元件。在積分電路
    的頭像 發(fā)表于 03-01 14:55 ?3204次閱讀
    運放反相放大電路與<b class='flag-5'>積分</b>電路<b class='flag-5'>中</b>反饋電阻和電容的作用

    【AI實戰(zhàn)項目】基于OpenCV的“顏色識別項目”完整操作過程

    OpenCV是一個廣受歡迎且極為流行的計算機視覺庫,它因其強大的功能、靈活性和開源特性而在開發(fā)者和研究者備受青睞。學習OpenCV主要就是學習里面的計算機視覺算法。要學習這些算法的原理,知道它們
    的頭像 發(fā)表于 12-09 16:42 ?1406次閱讀
    【AI實戰(zhàn)項目】基于<b class='flag-5'>OpenCV</b>的“顏色識別項目”完整操作過程

    基于OpenCV的拆分和合并圖像通道實驗案例分享_基于RK3568教學實驗箱

    。 在OpenCV,可以通過cv2.split()函數實現拆分圖像通道。這個函數接受一個彩色圖像作為輸入,并返回一個包含三個(對于RGB圖像)或四個(對于RGBA圖像,包含透明度通道
    發(fā)表于 12-03 14:27

    RK3568 + OpenCV 會碰撞出什么火花?案例詳解:2-1 基于OpenCV的畫線實驗

    一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。 OpenCV具有以下特點: 不管是科學研究,還是商業(yè)
    發(fā)表于 12-03 14:09

    手寫圖像模板匹配算法在OpenCV的實現

    OpenCV的模板匹配是支持基于NCC相似度查找的,但是不是很好用,一個主要的原因是查找最大閾值,只能匹配一個,自己比對閾值,又導致無法正確設定閾值范圍,所以問題很多。于是我重新寫了純Python版本的NCC圖像模板匹配的代碼實現了一個Python版本的,簡單易用,支持
    的頭像 發(fā)表于 11-11 10:12 ?766次閱讀
    手寫圖像模板匹配算法在<b class='flag-5'>OpenCV</b><b class='flag-5'>中</b>的實現

    SUMIF函數在數據分析的應用

    在商業(yè)和科學研究,數據分析是一項基本且關鍵的技能。Excel作為最常用的數據分析工具之一,提供了多種函數來幫助用戶處理和分析數據。SUMIF函數就是其中之一,它允許用戶根據特定的條件對數據進行求和
    的頭像 發(fā)表于 11-11 09:14 ?883次閱讀

    RTOS鉤子函數的用途及用法

    在很多操作系統(tǒng),都存在這樣一類API函數接口:HOOK函數(也叫鉤子函數)。
    的頭像 發(fā)表于 10-23 16:25 ?768次閱讀
    RTOS<b class='flag-5'>中</b>鉤子<b class='flag-5'>函數</b>的用途及用法

    在由運算放大器構成的積分,積分電容因該選什么類型的電容?

    請問:在由運算放大器構成的積分,積分電容因該選什么類型的電容
    發(fā)表于 09-24 07:21

    【龍芯2K0300蜂鳥板試用】5 搭建opencv開發(fā)環(huán)境

    在官方提供的buildroot根文件系統(tǒng),不支持opencv庫,故需要自己增加,另外,在本地編譯的時候,需要在本地(ubuntu)上安裝對應opencv庫,這樣才能將編譯好的鏡像放到板子上跑起來
    發(fā)表于 08-27 15:08

    簡述socket編程的常用函數

    Socket編程是一種基于TCP/IP協(xié)議的網絡編程技術,它允許應用程序通過網絡進行通信。在Socket編程,有許多常用的函數,它們用于創(chuàng)建、配置、連接、發(fā)送和接收數據等操作。以下是對這些常用函數
    的頭像 發(fā)表于 08-16 10:49 ?883次閱讀