【CUDA學習筆記】第九篇:基本計算機視覺操作【上】(附實踐源碼下載)

2021-02-21 AI人工智慧初學者

點擊上方AI人工智慧初學者,訂閱我!此刻開始我們一起學習進步!

1、訪問圖像的各個像素強度

2、OpenCV中直方圖的計算和均衡

3、圖像的幾何變換

        3.1、圖像大小調整

        3.2、圖像平移與旋轉

4、對圖像進行濾波操作

        4.1、均值濾波

        4.2、高斯濾波

        4.2、中值濾波

        當我們處理圖像時,有時會需要訪問特定位置的像素強度值,當我們想要改變一組像素的亮度或對比度或者想執行一些其他像素級操作時,這就非常有用。對於8位灰度圖像來說,一個點的強度值在0到255範圍內;而對於具有藍色、綠色和紅色三個通道的彩色圖像,每個點都具有三組不同的強度值,每一組的值都在0到255之間。

        OpenCV提供一個cv::Mat::at<>方法,可以訪問各個通道圖像裡特定位置的強度值。它需要一個參數,就是要訪問強度值的點位置,這裡使用帶有行列值作為參數的Point類來傳遞該點位置。對於灰度圖像,這個方法將返回一個標量對象;對於彩色圖像,它將返回三個強度值的矢量。用於訪問灰度及彩色圖像中特定位置以獲得該像素強度的代碼如下:

        首先讀取灰度圖像,然後在該圖像對象上調用at方法,測量點(100,50)的強度值,表示第100行和第50列處的像素,然後得到一個返回的標量,存儲在強度變量中,將這個值顯示在控制臺上。彩色圖像遵循相同的程序,但返回值是三個強度的矢量,存儲在Vec3b對象中,強度值顯示在控制臺上。上述程序的輸出:

        直方圖是圖像的一個非常重要的屬性,因為它提供該圖像外觀的全局描述。可以從直方圖獲得大量信息,包括表示圖像中灰度級出現的相對頻率,基本上由是X軸上的灰度級與Y軸上每個灰度級的像素數量所組成。如果直方圖集中在左側,則圖像將非常暗;如果它集中在右側,則圖像將非常亮。通常應該是均勻分布,能得到較好視覺效果。

        完美圖像在其所有灰度級中具有等量的像素,因此在整個範圍內直方圖應在較大的動態範圍裡有相同數量的像素,這可以通過直方圖均衡的技術來實現,這是所有計算機視覺應用中非常重要的預處理步驟。

        以下代碼描述灰度圖像上直方圖均衡的過程:

        將讀取的圖像上載到設備顯存裡,準備進行直方圖均衡。由於這是個計算密集的步驟,因此CUDA加速將有助於提高程序的性能。OpenCV為直方圖均衡提供equalizeHist函數,需要兩個參數:第一個參數是源圖像,第二個參數是目標圖像。然後將目標圖像下載回主機,並顯示在控制臺上。直方圖均衡後的輸出如圖

        可以看出,經過直方圖均衡的圖像比原始圖像的視覺質量更好。

        直方圖均衡也可以在彩色圖像上完成,而且必須在個別通道上進行,因此彩色圖像必須分成三個通道,每個通道各自執行直方圖均衡,然後合併通道再重建圖像。以下代碼描述彩色圖像上直方圖均衡的過程:

        BGR顏色空間的直方圖通常不太均衡,HSV和YCrCb顏色空間可以輔助處理,因此代碼中先將BGR顏色空間轉為HSV顏色空間,然後使用split函數將其拆分為三個獨立的通道。如此一來,色調和飽和度通道包含顏色信息,這兩個通道沒有需要均衡的地方,直方圖只要針對值通道進行均衡就行,然後再使用merge函數將三個通道合併,重建彩色圖像。最後將HSV彩色圖像轉換回BGR顏色空間,用imshow顯示出來。本段代碼執行的輸出如圖:

        總的來說,直方圖均衡能提高圖像的視覺質量,因此對於所有計算機視覺應用來說都是非常重要的預處理步驟。

        計算機視覺應用中,調整圖像大小、平移和旋轉圖像都是經常需要的功能。

3.1、圖像大小調整

        在某些計算機視覺應用中,圖像需要符合指定尺寸,因此需要將任意大小的圖像轉換成指定尺寸。OpenCV提供調整圖像大小的功能。圖像大小調整的代碼如下:

        如代碼所示,這裡有兩個不同函數可以獲取圖像的高度和寬度:Mat對象的rows和cols屬性分別描述圖像的height和width;Mat對象也可以用查找圖像大小的size()方式來獲取height和width屬性。圖像以兩種方式調整大小:在第一種方式中,圖像大小調整為(200,200)這個特定尺寸;第二種方式,調整為原始尺寸的一半。OpenCV為此操作提供resize函數,需要四個參數。

        前兩個參數分別是源圖像和目標圖像,第三個參數是目標圖像的大小,是使用Size對象定義的。調整圖像大小時,必須在源圖像中插入像素值以生成目標圖像,這裡有多種插值方法,諸如雙線性插值、雙三次插值、區域插值等都可用來作為像素的插值。這些插值方法作為resize函數的第四個參數,可以是cv::INTER_LINEAR(雙線性)、cv::INTER_CUBIC(雙三次)或cv::INTER_AREA(區域)。圖像大小調整代碼的輸出如圖:

 注意:不同的插值方法也會帶來速度的衰減,三線性插值相對比較慢的。

3.2、圖像平移與旋轉

        圖像平移與旋轉在一些計算機視覺應用中是重要的幾何變換,OpenCV提供一個簡單的API來對圖像執行這些變換。執行平移與旋轉的代碼如下:

        在代碼中,使用Mat對象創建此矩陣,其中70作為x方向的偏移量、50作為y方向的偏移量。此矩陣作為參數傳遞給warpAffine函數以進行圖像平移,warpAffine函數的其他參數分別是源圖像、目標圖像和輸出圖像的大小。

        旋轉過程則需要創建一個旋轉矩陣,以特定點為中心,對圖像執行特定角度的圖像旋轉。OpenCV提供cv::getRotationMatrix2D函數來構造這個旋轉矩陣,這個函數需要三個參數:第一個參數是旋轉點,也就是圖像旋轉中心;第二個參數是以度為單位的旋轉角度,本範例指定為45度;最後一個參數是尺度(scale),本範例指定為1。然後將構造的旋轉矩陣作為參數傳遞給warpAffine函數,以進行圖像旋轉。

圖像平移和圖像旋轉程序的輸出:

        前面所描述的各種方法都只針對單像素強度進行處理,因此也稱為「點處理」方法。而更多時候,查看像素的鄰域關係比只處理單像素強度有更大的用途,我們稱之為「鄰域處理」技術。鄰域可以是3×3,5×5,7×7等以特定像素為中心的矩陣。圖像濾波是一種重要的鄰域處理技術。

        濾波是信號處理中的一個重要概念:拒絕或允許某特定頻段通過。如何在圖像中測量頻率?如果某區域內的灰度級變化緩慢,那麼就是低頻區域;如果灰度級變化劇烈,這就是高頻區域。通常,圖像的背景被視為是低頻區域,邊緣是高頻區域。

4.1、均值濾波

        平均濾波器對鄰域像素執行平均操作。如果圖像中存在高斯噪聲,則可以使用這種低通平均濾波器來消除噪聲,但平均操作會使圖像邊緣變得模糊。鄰域可以是3×3,5×5,7×7,依此類推。濾波器窗口的尺寸越大,圖像的模糊程度就越大。

        cv::Ptr是智能指針的模板類,用於存儲cv::cuda::Filter類型的濾波器。接著用create-BoxFilter函數來創建不同窗口大小的平均濾波器,這個函數需要三個強制參數和三個可選參數:第一個和第二個參數是源圖像和目標圖像的數據類型,這裡設定為8位無符號灰度的CV_8UC1圖像;第三個參數定義濾波器窗口的大小,可以是3×3、5×5、7×7等;第四個參數是表示位於內核中心點的錨點,默認值為(-1,-1)。最後還有兩個關於像素插值方法和邊界值的可選參數,這裡省略。

        創建出來的濾波器指針有一個apply方法,能將創建的濾波器用在所有圖像上,它需要三個參數:第一個參數是源圖像,第二個參數是目標圖像,第三個可選參數是CUDA流,用於本書前面所述的多任務處理。代碼中,在圖像上應用了三個不同大小的平均濾波器,執行結果如圖6-8所示。往下一次kernel增大:

        從輸出的結果可以看出,雖然大型濾波器可以消除更多噪聲,但是隨著濾波器尺寸的增加,更多的像素被平均處理,導致圖像變得更加模糊。

4.2、高斯濾波

        高斯濾波器使用具有高斯分布的掩碼來過濾圖像,而不是簡單的平均掩碼。這個濾波器還在圖像上引入平滑模糊,這個方法已經被廣泛用於消除圖像中的噪聲。

        createGaussianFilter函數用於為高斯濾波器創建掩碼,需要提供源圖像/目標圖像的數據類型、濾波器的大小以及水平方向標準差作為這個函數的參數。我們還可以提供豎直方向標準差作為參數,如果不提供的話,會用水平方向標準差作為其默認值,然後用apply方法創建出不同大小的高斯掩碼應用於圖像處理。本段代碼的輸出如圖:

        同樣地,隨著高斯濾波器尺寸的增加,圖像變得更加模糊。高斯濾波器用於消除噪聲並在圖像上引入平滑模糊。

4.3、中值濾波

        當圖像受到椒鹽噪聲的影響,那麼平均濾波器或高斯濾波器是消除不了的,這時候需要一個非線性的濾波器。用鄰域的中值運算去替代平均值的方式可以幫助消除椒鹽噪聲。在這個濾波器中,鄰域中的9像素值的中值放置於中心像素處,這將能消除椒鹽噪音所產生的過高或過低的極端值。雖然OpenCV和CUDA提供了中值濾波功能,但它比OpenCV的常規函數慢。

        OpenCV中的medianBlur函數用於實現中值濾波器,它需要三個參數:第一個參數是源圖像,第二個參數是目標圖像,第三個參數是中值運算的窗口大小。中值濾波的輸出如圖:

        如圖所示,源圖像受椒鹽噪聲的影響。通過3×3尺寸的中值濾波器完全消除了這種噪聲,而且沒有產生極端模糊。因此,當圖像應用受椒鹽噪聲影響時,中值濾波是一個非常重要的預處理步驟。

筆記大部分內容來源於書籍:【基於GPU加速的計算機視覺編程】

關注【AI人工智慧初學者】並回復【cuda9】即可獲取本文的完整源碼,只希望可以幫到你,當然,大佬除外啦~~~~

聲明:轉載請說明出處

下方為小生公眾號,還望包容接納和關注,非常期待與您的美好相遇,讓我們以夢為馬,砥礪前行。

長按識別二維碼關注一下

更多精彩內容可回復關鍵詞

每篇文章的主題即可

點「在看」給我一朵小黃花

相關焦點

  • 【CUDA學習筆記】第八篇:源碼編譯OpenCV+CUDA模塊(完整源碼打包一次成功編譯)
    此刻開始我們一起學習進步!1、OpenCV+CUDA+Contrib的源碼編譯2、OpenCV+CUDA+Contrib的測試3、源碼級相關難下載文件的集成下載(附連結)1、OpenCV+CUDA+Contrib的源碼編譯1、cmake軟體打開,選擇opencv源碼文件夾
  • 【CUDA學習筆記】第十一篇:FPS1000+的背景減法之目標跟蹤(附實踐源碼下載)
    #include <iostream>#include <string>#include "opencv2/opencv.hpp"using namespace std;using namespace cv;using namespace cv::cuda;int main(){VideoCapture cap
  • [CUDA OpenCV]GPU加速的計算機視覺學習資源下載
    點擊我愛計算機視覺標星,更快獲取CVML新技術今天跟大家介紹一本學習CUDA加速的OpenCV的新書《Hands-On
  • 【CUDA學習筆記】第一篇:一個基本的CUDA C程序(附配置方法和安裝包下載方式)
    此刻開始我們一起學習進步!1、CUDA的簡介2、GPU架構和CUDA介紹3、CUDA架構4、開發環境說明和配置5、開始第一個Hello CUDA程序    5.1、VS2017創建NVIDIA CUDA項目    5.2、VS2017中輸入 CUDA代碼(附.cu代碼以及講解)    5.3、VS2017生成並開始執行
  • 【CUDA學習筆記】第五篇:內存以及案例解釋(附案例代碼下載方式)
    此刻開始我們一起學習進步!紋理內存支持2D和3D的紋理讀取操作,在你的CUDA程序裡面使用紋理內存可沒有那麼輕易,特別是對那些並非編程專家的人來說。但可以在主機上通過cudaMemcpyToArray函數寫入,如同之前的代碼中看到的那樣。在cudaMemcpyToArray函數中,第二個和第三個參數中的0代表傳輸到的目標CUDA數組橫向和縱向上的偏移量。兩個方向上的偏移量都是0代表我們的這次傳輸將從目標CUDA數組的左上角(0,0)開始。
  • 面向RTX 3090的深度學習筆記
    這篇文章的每一句話很可能都是錯的但某些地方,它們總是有用的哪怕這篇文章沒有一個結論正確,來閱讀文章的你們,至少也可以藉此思考和探究,我們應該考慮系統的哪些方面,究竟有哪些東西能夠影響深度學習的性能。由於這裡只是筆記,筆記不會記載課本中的常見知識(了解那些知識應該去讀課本!)這裡只會記錄和整理一些原本放在我腦子裡的東西。
  • 計算機視覺:從入門到精通,極限剖析圖像識別學習算法
    本次課程將圍繞著計算機視覺中最常見的RCNN圖像識別算法進行極限剖析,從數學理論, 模型框架到實踐實操,讓你在短時間內從理論到實踐,掌握深度學習的基本知識和學習方法。· 目的:掌握神經網絡的基本原理,知其然亦知其所以然(從數學實踐到代碼的熟練和精通); · 手段:科學的方法。
  • CUDA8.0+VS2015+Win10開發環境搭建教程
    視覺IMAX的第38篇原創文章前言本文參考了網絡上的其他文檔,在此不一一致謝了,前輩們的經驗都是強大的指明燈。根據實踐中的具體情況,進行了勘誤和修正,僅供新手借鑑,至於高手們可以略過了。二 安裝cuda8.0在「視覺IMAX」公眾號後臺回復「cuda8.0」,即可獲得cuda_8.0.61_win10的安裝包連結。安裝包下載完成後,咱們開始進行cuda的安裝。默認安裝路徑,並記住cuda安裝程序的路徑。
  • 推薦幾個不錯的CUDA入門教程(非廣告)
    對於CUDA編程以及它所需要的GPU、計算機組成、作業系統等基礎知識,我基本上都忘光了,因此也翻了不少教程。這裡簡單整理一下,給同樣有入門需求的同學們參考一下。❞官方文檔及書籍英文好、時間充裕的同學可以精讀官方文檔或者著作。
  • 2019年度最佳書單:深度學習/機器學習/強化學習(附部分電子書下載)
    它描述了業內從業者使用的深度學習技術,包括深度前饋網絡,正則化,優化算法,卷積網絡,序列建模和實用方法;它調查了自然語言處理,語音識別,計算機視覺,在線推薦系統,生物信息學和視頻遊戲等應用。最後,本書提供了研究視角,涵蓋了線性因子模型,自動編碼器,表示學習,結構化概率模型,蒙特卡羅方法,分區函數,近似推理和深度生成模型等理論主題。
  • 視覺算法工業部署及優化學習路線分享
    2017年:比你大一屆,本人也是20屆的渣渣碩士,剛剛上研的時候,和大多數「內捲兒」一樣,我也很幸運被老闆安排了「計算機視覺&圖像處理&模式識別」的研究方向。屁顛屁顛的開始看cvpr,iccv的paper。
  • 深度學習筆記15:ubuntu16.04 下深度學習開發環境搭建與配置
    作者:魯偉一個數據科學踐行者的學習日記。
  • 下載量過百萬的吳恩達機器學習和深度學習筆記更新了!(附PDF下載)
    今天,我把吳恩達機器學習和深度學習課程筆記都更新了,並提供下載,這兩本筆記非常適合機器學習和深度學習入門。
  • 實戰 | 源碼入門之Faster RCNN
    前言學習深度學習和計算機視覺,特別是目標檢測方向的學習者,一定聽說過Faster Rcnn;在目標檢測領域,Faster Rcnn表現出了極強的生命力,被大量的學習者學習,研究和工程應用。在預處理部分主要的操作就是resize圖像的大小、像素值的處理以及圖像的隨機翻轉。
  • 獨家 | 如何為計算機視覺和深度學習安置英偉達?
    圖6:用你屏幕中靠近右上角的圖標來安置Jetson Nano的網絡設置,你會需要網絡訪問來下載和安置用於計算機視覺和深度學習的軟體一旦你看到了NVIDIA + Ubuntu 18.04的桌面,你可以按需要用圖六中顯示的菜單欄上的圖標來安置你的有線或者無線網絡設置
  • 計算機視覺基於圖像的三維重建入門介紹
    計算機視覺從技術角度目前分為兩大類:一類是基於傳統幾何的計算機視覺,另一類是基於深度學習的計算機視覺。
  • 綜述|計算機視覺中的注意力機制
    設為星標,第一時間獲取更多乾貨連結:https://zhuanlan.zhihu.com/p/146130215之前在看DETR這篇論文中的self_attention,然後結合之前實驗室組會經常提起的注意力機制,所以本周時間對注意力機制進行了相關的梳理,以及相關的源碼閱讀了解其實現的機制。
  • PyTorch 源碼解讀之 torch.cuda.amp: 自動混合精度詳解
    自動混合精度(Automatic Mixed Precision, AMP)訓練,是在訓練一個數值精度 FP32 的模型,一部分算子的操作時,數值精度為 FP16,其餘算子的操作精度是 FP32,而具體哪些算子用 FP16,哪些用 FP32,不需要用戶關心,amp 自動給它們都安排好了。
  • 2020暑期第13屆全國高校師資班(線上)—深度學習、Python、計算機視覺、區塊鏈、自然語言處理、大數據
    資源下載:課程PPT、實驗操作手冊(附錄像)、實驗環境鏡像、出版社課程資源課後實驗超長機時:24小時隨時做,超長機時:30天*24小時=720小時課程時長:每個課程,直播時長20小時,實驗錄播時長10小時,180天回放
  • 【長篇博文】Docker學習筆記與深度學習環境的搭建和部署(二)
    歡迎關注我的csdn:原始碼殺手我的CSDN上一篇文章:Docker學習筆記與深度學習環境的搭建和部署(一)https://blog.csdn.net/weixin_41194129/article/details/113823982【長篇博文】Docker學習筆記與深度學習環境的搭建和部署