基於opencv 的圖像處理入門教程

2020-12-15 AI算法筆記

前言

雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。

所以本文主要是介紹用 OpenCV 實現一些基本的圖像處理操作,本文的目錄如下所示:

安裝旋轉圖片裁剪圖片調整圖片大小調整圖片對比度模糊圖片高斯模糊中值模糊邊緣檢測轉為灰度圖形心檢測對彩色圖片採用蒙版(mask)提取圖片的文字(OCR)檢測和修正歪曲的文字顏色檢測去噪檢測圖片的輪廓移除圖片的背景原文地址:https://likegeeks.com/python-image-processing/代碼和樣例圖片的地址:https://github.com/ccc013/CodesNotes/tree/master/opencv_noteshttps://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb1. 安裝OpenCV 的安裝還是比較簡單的,直接用 pip 命令在命令行安裝即可,輸入以下命令:pip install opencv-python驗證是否安裝成功,可以運行 python 命令,然後分別輸入以下命令:import cv2運行成功,沒有報錯,即安裝成功。2. 旋轉圖片首先,還是需要導入 cv2模塊:import cv2然後第一件事情就是讀取圖片,調用 imread 函數即可,輸入參數是圖片的路徑,如下代碼以及運行結果:

下面的所有功能實現,我都是在 jupyter notebook上實現的,所以展示圖片部分和原文有所不同,原文展示圖片代碼是採用:cv2.imshow('original image', img)cv2.waitKey(0)而在 jupyter 中,需要先導入下面的庫:import matplotlib.pyplot as plt%matplotlib inline然後直接調用plt.imshow()函數,不過 opencv 都需要做一個轉換過程,即:plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))讀取好圖片後,接下來就是實現旋轉圖片,這裡分為以下三個步驟:獲取圖片的寬和高調用函數cv2.getRotationMatrix2D() 得到旋轉矩陣通過 wrapAffine 實現旋轉實現的代碼如下所示:

3. 裁剪圖片裁剪圖片的步驟如下:讀取圖片,並獲取圖片的寬和高;確定裁剪後圖片的寬和高;開始裁剪操作實現代碼如下所示:

4. 調整圖片大小對圖片進行調整大小的操作,採用的是resize()函數,這裡有兩種方式進行調整大小:坐標軸方式來指定縮放比例,即fx, fy參數;直接給出調整後圖片的大小。第一種方式的實現代碼:

第二種方法的實現代碼:

5. 調整圖片對比度在 Python 的 OpenCV 模塊中並沒有特定的實現調整圖片對比度的函數,但官方文檔給出實現調整圖片亮度和對比度的公式,如下所示:new_img = a*original_img + b官方文檔地址:https://docs.opencv.org/master/d3/dc1/tutorial_basic_linear_transform.html這裡公式中的 a 表示圖片的對比度,如果它大於 1,就是高對比度;如果在 0-1 之間,那就是低對比度;等於 1,表示沒有任何變化b的數值範圍是 -127 到 127;要實現上述公式,可以採用 addWeighted()方法,它輸出的圖片是一個 24 位的 0-255 範圍的彩色圖片。其語法如下所示:cv2.addWeighted(source_img1, alpha1, source_img2, alpha2, beta)這個方法是接收兩張輸入的圖片,然後根據 alpha1 和 alpha2來將兩種圖片進行融合。如果只是想調整圖片的對比度,那麼可以將第二個圖片通過 Numpy 設置為 0。所以,實現的代碼如下所示:

6. 模糊圖片高斯模糊高斯模糊採用的是 GaussianBlur() 方法,採用高斯核,並且核的寬和高必須是正數,且是奇數。高斯濾波主要用於消除高斯噪聲,可以保留更多的圖像細節,經常被稱為最有用的濾波器。實現的代碼如下所示:

中值模糊對於中值模糊,就是用區域內的中值來代替本像素值,因此孤立的斑點,比如 0 或者 255 的數值很容易消除掉。所以中值模糊主要用於消除椒鹽噪聲和斑點噪聲。實現代碼:

7. 邊緣檢測邊緣檢測主要是通過 Canny() 方法,它實現了 Canny 邊緣檢測器,這也是目前最優的邊緣檢測器。Canny() 方法的語法如下:cv2.Canny(image, minVal, maxVal)其中 minVal 和 maxVal 分別表示梯度強度值的最小值和最大值。實現代碼如下:

8. 轉為灰度圖最簡單的將圖片轉為灰度圖的方法,就是讀取的時候,代碼如下所示:img = cv2.imread("example.jpg", 0)而另一種方法就是用 BGR2GRAY,實現代碼:

9. 形心檢測檢測一張圖片的形心位置,實現步驟如下所示:讀取圖片,並轉為灰度圖;通過moments()方法計算圖片的moments;接著利用第二步的結果來計算形心的 x,y 坐標最後可以繪圖展示檢測的結果。本例使用的圖片如下:

實現代碼:

10.對彩色圖片採用蒙版(mask)圖像蒙版就是將一張圖片作為另一張圖片的蒙版,或者是修改圖片中的像素值。本例中將採用 HoughCircles() 方法來應用蒙版,這個方法可以檢測圖片中的圓,然後對這些圓應用蒙版。本例採用的圖片為:

實現代碼:

11.提取圖片的文字(OCR)實現提取圖片的文字是通過安裝使用谷歌的 Tesseract-OCR ,首先需要從下面這個網址中下載:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.02-20180621.exe接著再進行安裝:pip install pytesseract如果是 mac,安裝步驟可以是這樣的:brew install tesseractpip install pytesseract本例使用的圖片:

實現代碼如下所示:

注意這裡需要設置 tesseract 的執行路徑,兩種方法,第一種是設置環境變量:windows 版:https://blog.csdn.net/luanyongli/article/details/81385284第二種是在代碼中進行指定,即代碼中pytesseract.pytesseract.tesseract_cmd = '/usr/local/bin/tesseract'這裡我用的是 Mac,所以這個路徑可以在命令行中輸入 which tesseract 來找到。12. 檢測和修正歪曲的文字在本例中,使用的圖片如下:

首先還是先讀取圖片,並轉換為灰度圖:

接著採用 bitwise_not 方法將背景和文字顏色進行交換,變成白字黑底:

接著分別找到 x,y 坐標中大於 0 值的像素值,並通過 minAreaRect() 計算得到歪曲的角度,接著就是計算要修正的角度,然後再通過之前旋轉圖片的方法來修正,實現代碼和結果如下:

13. 顏色檢測在本次例子中實現檢測圖片中的綠色區域,使用的圖片:

首先是讀取圖片後,轉換到 HSV 空間:

接著需要通過 Numpy 設置綠色像素值的上下範圍區間:lower_green = np.array([34, 177, 76])upper_green = np.array([255, 255, 255])接著通過 inRange() 方法來判斷輸入圖片中是否包含在設置後的綠色區間範圍內,如果有,那就表示檢測到綠色這種顏色的像素區域。實現的代碼:

14. 去噪OpenCV 中提供了下面 4 種圖像去噪的方法:1. fastNlMeansDenoising():從灰度圖中降噪;2. fastNlMeansDenoisingColored():從彩色圖片中降噪3. fastNlMeansDenoisingMulti():從灰度圖片幀(灰度視頻)中降噪;4. fastNlMeansDenoisingColoredMulti():從彩色圖片幀中降噪本次例子會用第二種方法:fastNlMeansDenoisingColored()實現的代碼如下所示:

其中對於方法 fastNlMeansDenoisingColored() 的個參數分別是:輸入的原圖輸出圖片,不過這裡設置為 None,我們直接保存到 result 變量裡;濾波器強度和濾波器強度一樣,但針對的是彩色圖片的噪聲,一般設置為 10;模板塊像素大小,必須是奇數,一般設置為 7;計算給定像素均值的窗口大小15. 檢測圖片的輪廓輪廓是圖片中將連續的點連接在一起的曲線,通常檢測輪廓的目的是為了檢測物體。本例中使用的圖片如下:

檢測輪廓的步驟如下:讀取圖片,並轉為灰度圖;通過 threshold () 找到閾值,通常設置 127-255 的區間採用 findContours() 進行檢測輪廓,具體使用方法可以查看官方文檔:https://docs.opencv.org/3.4.2/d3/dc0/group__imgproc__shape.html#ga17ed9f5d79ae97bd4c7cf18403e1689a最後是通過 drawContours() 來繪製畫好的輪廓,然後展示出來實現代碼:

16. 移除圖片的背景移除圖片背景的實現思路是這樣的:檢測圖片主要物體的輪廓;背景通過 np.zeros 生成一個蒙版 mask;採用 bitwise_and 運算符來結合檢測輪廓後的圖片和蒙版 mask本次樣例使用的原圖:

實現代碼:import cv2import numpy as npimg = cv2.imread("opencv_bg.png")gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, thresh = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)img_contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]img_contours = sorted(img_contours, key=cv2.contourArea)for i in img_contours:if cv2.contourArea(i) > 100:breakmask = np.zeros(img.shape[:2], np.uint8)cv2.drawContours(mask, img_contours, -1, 255, -1)new_img = cv2.bitwise_and(img, img, mask=mask)plt.figure(figsize=(32, 32))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(new_img, cv2.COLOR_BGR2RGB))

小結本文是簡單介紹了基於 opencv 實現的一些圖像處理操作,從基礎的旋轉,裁剪,調整大小,到模糊圖片,邊緣檢測,修正歪曲文字,去噪,檢測輪廓等操作,都給出了基礎的實現代碼,如果需要更深入了解,這裡推薦:opencv 官方文檔:https://docs.opencv.org/master/d9/df8/tutorial_root.htmlhttps://github.com/ex2tron/OpenCV-Python-Tutorial圖像處理 100 問:https://github.com/gzr2017/ImageProcessing100Wen最後,原文地址:

https://likegeeks.com/python-image-processing/

代碼和樣例圖片的地址:

https://github.com/ccc013/CodesNotes/tree/master/opencv_notes

https://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb

相關焦點

  • opencv教程-圖像反向投影
    先回顧下圖像直方圖,接口如下,比如使用灰度圖像:hist = cv.calcHist([img_gray], [0], None, [5], [0,256], accumulate=False)[0]:說明使用的第一個通道,灰度圖的話只能是0了;如果是彩色圖
  • opencv教程-圖像平滑、二值化
    1:圖像平滑圖像平滑也就是模糊處理,去噪處理。這裡我們先來了解以下幾個詞:低頻分量:圖像種亮度/灰度變化比較平緩的部分。高頻分量:圖像種亮度/灰度變化比較大的部分,比如噪點。低通濾波:去除高頻分量,保留低頻分量,可用來去噪。高通濾波:去重低頻分量,保留高頻分量,可用來做邊界檢測。
  • 「python opencv 計算機視覺零基礎實戰」第一節
    前置條件說明:本系列opencv實戰教程將從基礎到實戰,若只是簡單學習完python也可以通過該教程完成一般的機器學習編程;文中將會對很多python的基礎內容進行講解,但由於文章定位的原因將不會贅述過多的基礎內容,基礎內容進行第一次講解後第二次將不會過多贅述,本文主要講解的是opencv相關知識。
  • opencv教程-輪廓檢測
    1:輪廓檢測的基本流程圖像灰度化→圖像二值化或邊緣檢測→輪廓檢測2:輪廓特徵輪廓矩,面積,周長等>6:擬合橢圓7:輪廓的常用屬性https://docs.opencv.org9:輪廓匹配dis= cv.matchShapes(cnt1,cnt2,1,0.0)基於hu矩計算兩個輪廓的距離,越小越相似。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    php-opencv 項目的 logo我曾考慮使用 SWIG 寫一個 php-opencv 模塊,並花費了大量時間在上面,但是並沒有取得任何成果。一切都因為我不懂 C / C++ 並且沒有為 PHP 7 編寫過擴展文件而變得複雜。不幸的是,網上大多數材料都是基於 PHP 5 而寫的 PHP 擴展,因此我不得不一點點收集信息並自己解決問題。
  • 藉助Streamlit框架,可僅使用Python代碼來構建基於瀏覽器的UI
    圖源:unsplash藉助Streamlit框架,使用用戶界面展示Python項目變得前所未有的簡單,你可以僅僅使用Python代碼來構建基於瀏覽器的UI。現在,我希望將此程序變成一個單頁Web應用程式,用戶可以在其中上傳迷宮圖像(或使用默認迷宮圖像),調整迷宮的開始和結束位置,並查看最終解決的迷宮。首先,為圖像上傳器創建UI,並選擇使用默認圖像的選項。
  • opencv教程-形態學處理、邊緣檢測
    1:形態學處理(常用於二值化圖像)腐蝕:對核範圍內的像素,只要有一個是非前景,則設置為背景;比如對於3*3的核函數,如果當前像素的3*3鄰域內像素全是前景則保留,否者設置為背景;常用於去除較小噪聲,分離物體。
  • Qt5.12.2+Opencv4.2配置動態連結庫以用Qt調用Opencv進行創作
    2、Opencv 4.23、CMAKE 3.17二、軟體安裝及環境變量配置1、Qt creator安裝(1)Qt安裝本教程針對之前下載的版本的sources文件(2)Opencv sources文件解壓l 然後點擊下載好的opencv-4.2.0-vc14_vc15文件將opencv4.2的資源文件解壓到你指定的安裝路徑中,得到如下圖所示文件夾內容:我的安裝路徑為
  • 一種基於HD-SDI技術的高清圖像處理系統設計
    摘要:隨著圖像處理技術及傳感器技術的不斷發展,高清數字圖像取代模擬圖像成為一種趨勢。設計了一種基於HD-SDI技術的高清圖像處理系統,可通過FPGA+DSP架構對1080P全高清圖像進行採集和字符疊加,並實時進行目標提取和偏差量計算。疊加視頻可通過DVI數字接口或模擬接口實時顯示。利用圖像高解析度特性,系統可實現運動目標精確跟蹤。
  • 基於Pyhton的圖像隱寫術-如何隱藏圖像中的數據
    簡而言之,隱寫術的主要目的是在任何文件(通常是圖像,音頻或視頻)中隱藏預期的信息,而無需實際更改文件的外觀,即,其外觀應與以前相同。 本期我們將一起學習基於圖像的隱寫術,即在圖像中隱藏秘密數據。 但是在深入研究之前,讓我們先看看圖像的組成。 1.像素是圖像的基礎。
  • 基於FPGA的圖像實時處理系統設計
    由於現場實時測量的需要,機器視覺技術越來越多地藉助硬體來完成,如DSP晶片、專用圖像信號處理卡等。但是,DSP做圖像處理也面臨著由於數據存儲與處理量大,導致處理速度較慢,系統實時性較差的問題。
  • 3D視覺從入門到精通系統學習教程
    星球主要關注3D視覺、vSLAM、三維重建、點雲處理、立體視覺、結構光、深度學習、計算機視覺和圖像處理等方向。日常分享各個領域的最新進展和經典論文,會員可以免費對嘉賓進行技術提問,完成一對一的指導解答,星球的初衷是讓更多的童鞋能夠儘快熟悉自己研究的3D視覺領域,少走一些彎路。
  • 浩洋股份(300833.SZ):「一種基於圖像處理的舞檯燈自動對焦系統及...
    涉及專利名稱為:一種基於圖像處理的舞檯燈自動對焦系統及方法。該發明專利所涉及技術屬於公司主要技術,該等專利已應用於公司現有的產品。專利權的取得不會對公司目前生產經營產生重大影響,但有利於完善智慧財產權保護體系,發揮公司自主智慧財產權優勢,增強公司的核心競爭力。 (責任編輯: HN666)
  • 編程去除背景綠幕摳圖,基於.NET+OpenCVSharp
    因為需要先把AForge.NET採集到的Bitmap轉換為OpenCVSharp的Mat,摳圖處理完成後再把Mat轉換回Bitmap,顯示到界面上。所以我就直接使用OpenCVSharp的VideoCapture類來完成攝像頭圖像的採集,由於它採集到的幀圖像直接用Mat表示,省去了轉換環節,速度得到了很大的提升。
  • 基於圖像增強的去霧快速算法的FPGA實現
    摘要:基於圖像增強方法,本文提出了一種使用亮度映射的圖像去霧快速算法。此算法通過調整室外多霧場景圖像的對比度,提高了霧中物體的辨識度。算法的複雜度低、處理延遲小,實時性高,利於FPGA的實現。實現時不需外存儲器,延時為ns級,並提供了強度調節接口,以適應較廣的應用環境。
  • 用OpenCV 去除圖片中的水印,騷操作!
    參考連接:https://stackoverflow.com/questions/32125281/removing-watermark-out-of-an-image-using-opencv好久不見,大家好啊,最近太忙了,搞得好久沒更原創文了(說到底還是懶,),
  • PhotoShop2020圖像處理:圖像的存儲格式
    可以處理24位顏色的圖像,支持RGB、位圖、灰度、索引模式,但不支持Alpha通道GIF格式:基於在網絡上傳輸圖像而創建的文件格式,它採用LZW無損壓縮方式。支持透明背景和動畫,被廣泛應用在網絡文檔中EPS格式:為在PostScript印表機上輸出圖像而開發的文件格式,幾乎所有的圖形、圖表、頁面排版程序都支持該格式。
  • AE小白教程,讓你從入門就是大神(一)
    AE小白教程,讓你從入門開始就是大神(一)相信各位學過AE(After effect)的小夥伴,都知道這個軟體就是一隻披著綿羊皮的老虎,看起來操作簡易,輕鬆上手,實際層面眾多,難以下手!層是構成合成圖像的基本組件,在合成圖像窗口添加的素材都將作為層使用,可以直接從項目窗口拖動放置到時間層窗口,也可以拖動到合成圖像窗口中。而素材的長度並不是都符合我們的要求,所以就需要用到剪輯功能,一般使用以下兩種方式:1. 在時間布局窗口直接拖動圖層,改變入點和出點。2. 在合成圖像窗口中,滑動時間條到相應位置,設置入點和出點。
  • 使用Tensorflow+OpenCV構建會玩石頭剪刀布的AI
    在我們遍歷系統中的文件以訪問圖像之後,cv2.imread()函數返回圖像的矢量表示。我們通過翻轉圖像並放大圖像來進行一些手動的數據增強,這增加了我們的數據集大小,而無需拍攝新照片,數據增強是生成數據集的關鍵部分。最後,圖像和標籤存儲在單獨的numpy數組中。