前言
雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 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