OpenCV學習筆記之二:圖像處理中常用的函數介紹

一、imread

Mat imread(const String& filename,int flags = IMREAD_COLOR);

返回Mat對象;

參數filename: 待打開圖片的絕對地址,需要注意的是,並不是所有文件都可以用它打開,它支持的文件如下;函數識別不是依靠文件的後綴名,而是依靠內容的編碼格式;

需要注意的是imread讀取數據時會重新排列數據。

  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)
  • JPEG 2000 files - *.jp2 (see the Notes section)
  • Portable Network Graphics - *.png (see the Notes section)
  • WebP - *.webp (see the Notes section)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Notes section)
  • OpenEXR Image files - *.exr (see the Notes section)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by Gdal (see the Notes section)

參數flags:打開的參數,這個非常重要,因爲如果設置不合適的話,很容易出現預想之外的效果。它可以指導將原圖讀取時進行一定的轉換。默認值是IMREAD_LOAD_GDAL。因此,如果是想直接處理原圖,應該設置爲IMREAD_UNCHANED。

常用的一般是下面三種

  • IMREAD_UNCHANGED 保持原來的圖像
  • If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
  • IMREAD_GRAYSCALE 灰度圖像
  • If set, always convert image to the single channel grayscale image.
  • IMREAD_COLOR 彩色圖像
  • If set, always convert image to the 3 channel BGR color image.

當然爲了簡單起見,我們可以用數字設置,如果寫爲1最後輸出就顯示原圖,如果寫爲0,最後輸出就顯示灰度圖。

二、imshow

cv2.imShow(const string& winname, InputArray mat)

函數可以在窗口中顯示圖像。該窗口和圖像的原始大小自適應(自動調整到原始尺寸)。

  •  第一個參數,const string&類型的winname,填需要顯示的窗口標識名稱。
  •  第二個參數,InputArray 類型的mat,填需要顯示的圖像。

imshow 函數用於在指定的窗口中顯示圖像。如果窗口是用CV_WINDOW_AUTOSIZE(默認值)標誌創建的,那麼顯示圖像原始大小。否則,將圖像進行縮放以適合窗口。而imshow 函數縮放圖像,取決於圖像的深度: 

  • 如果載入的圖像是8位無符號類型(8-bit unsigned),就顯示圖像本來的樣子。
  • 如果圖像是16位無符號類型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是說,值的範圍是[0,255 x 256]映射到[0,255]。
  • 如果圖像是32位浮點型(32-bit floating-point),像素值便要乘以255。也就是說,該值的範圍是[0,1]映射到[0,255]。

三、waitKey

cv2.waitKey(ms)

是一個和鍵盤綁定的函數,它的作用是等待一個鍵盤的輸入(因爲我們創建的圖片窗口如果沒有這個函數的話會閃一下就消失了,所以如果需要讓它持久輸出,我們可以使用該函數)。它的參數是毫秒級。該函數等待任何鍵盤事件的指定毫秒。Ms=0如果您在此期間按下任何鍵,程序將繼續進行。我們也可以將其設置爲一個特定的鍵。

四、destroyALLWindows

cv2.destroyWindow()

銷燬我們創建的所有窗口。如果要銷燬任何特定窗口,請使用函數cv2.destroyWindow(),其中傳遞確切的窗口名稱作爲參數。(應該是使用創建窗口時所使用的窗口名稱,字符串類型。)

五、namedWindow

顧名思義,namedWindow函數,用於創建一個窗口。函數原型是這樣的:

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );  

第一個參數,const string&型的name,即填被用作窗口的標識符的窗口名稱。

第二個參數,int 類型的flags ,窗口的標識,可以填如下的值:

  • WINDOW_NORMAL設置了這個值,用戶便可以改變窗口的大小(沒有限制)
  • WINDOW_AUTOSIZE如果設置了這個值,窗口大小會自動調整以適應所顯示的圖像,並且不能手動改變窗口大小。
  • WINDOW_OPENGL 如果設置了這個值的話,窗口創建的時候便會支持OpenGL。

函數剖析:

  1. 首先需要注意的是,它有默認值WINDOW_AUTOSIZE,所以,一般情況下,這個函數我們填一個變量就行了。
  2. namedWindow函數的作用是,通過指定的名字,創建一個可以作爲圖像和進度條的容器窗口。如果具有相同名稱的窗口已經存在,則函數不做任何事情。
  3. 我們可以調用destroyWindow()或者destroyAllWindows()函數來關閉窗口,並取消之前分配的與窗口相關的所有內存空間。
  4. 但話是這樣說,其實對於代碼量不大的簡單小程序來說,我們完全沒有必要手動調用上述的destroyWindow()或者destroyAllWindows()函數,因爲在退出時,所有的資源和應用程序的窗口會被操作系統會自動關閉。

六、imwrite

在OpenCV中,輸出圖像到文件,我們一般都用imwrite函數,它的聲明如下:

bool imwrite(const string& filename,InputArray img, const vector<int>& params=vector<int>() );  

  • 第一個參數,const string&類型的filename,填需要寫入的文件名就行了,帶上後綴,比如,“123.jpg”這樣。
  • 第二個參數,InputArray類型的img,一般填一個Mat類型的圖像數據就行了。
  • 第三個參數,const vector<int>&類型的params,表示爲特定格式保存的參數編碼,它有默認值vector<int>(),所以一般情況下不需要填寫。

七、split

b,g,r=cv2.split(img)

我之前說過彩色圖像是由BGR三個通道組成的,也就是三個0-255的數組

如果把彩色圖片拆分後,那麼得到的應該是三張灰色圖像

八、merge

BGR=cv2.merge([b,g,r])

與split恰恰相反,把三個通道的顏色合成圖像

九、addWeighted

addWeighted( src1, alpha, src2, beta, 0.0, dst)

  • 第1個參數,輸入圖片1,
  • 第2個參數,圖片1的融合比例
  • 第3個參數,輸入圖片2
  • 第4個參數,圖片2的融合比例
  • 第5個參數,偏差,不能省略
  • 第6個參數,輸出圖片,可選

計算的方式如下:

十、CvtColor

函數形式: void cvCvtColor( const CvArr* src, CvArr* dst, int code );

參數列表:

src:源圖像(輸入的 8-bit , 16-bit 或 32-bit 單倍精度浮點數影像)

dst:目標圖像(輸入的 8-bit , 16-bit 或 32-bit 單倍精度浮點數影像)

code:轉換代碼

  • 彩色轉換灰度:COLOR_BGR2GRAY
  • BGR轉換RGB:COLOR_BGR2RGB
  • 灰度轉彩色:COLOR_GRAY2BGR

十一、resize

  1. cv2.resize(scr,dsize);

scr:原始圖像

dsize:縮放的大小,(a,b)a是代表有多少列,b代表多少行

  2.   cv2.resize(scr,dsize,fx,fy);

scr:原始圖像

dsize爲空時,fx,fy表示縮放爲原來的倍數(可以小於1)

十二、flip

flip(src,flipCode);

src:原始圖像

flipCode:

  • =0:上下翻轉
  • >0:左右翻轉
  • <0:先水平上下翻轉再左右翻轉

十三、threshold

ret, dst = cv2.threshold(src, thresh, maxval, type)

src: 輸入圖,只能輸入單通道圖像,通常來說爲灰度圖

dst: 輸出圖

thresh: 閾值=ret,一般情況指定128

maxval: 當像素值超過了閾值(或者小於閾值,根據type來決定),所賦予的值

type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超過閾值部分取maxval(最大值),否則取0
  • cv2.THRESH_BINARY_INV THRESH_BINARY的反轉
  • cv2.THRESH_TRUNC 大於閾值部分設爲閾值,否則不變
  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反轉
  • cv2.THRESH_TOZERO 大於閾值部分不改變,否則設爲0

十四、boxFilter

boxFilter(原始圖像,目標圖像深度,核大小,normalize屬性);

  • 目標圖像深度一般爲-1,表示與原始圖像保持一致
  • 核大小就是對周圍取值的範圍
  • normalize屬性:是否進行歸一化處理,歸一化代表取均值=均值濾波;不進行歸一化的話就是取和,容易溢出,就是和很容易大於255

十五、GaussianBlur

GaussianBlur(str,ksize,sigmax)

str:原始圖像

ksize:核大小,必須是奇數

sigmax:X方向的方差,控制權重,一般取0,自動根據核大小計算

十六、medianBlur

相當於用中值代替

medianBlur(img, Ksize)

Ksize:核大小,必須是大於1的奇數

十七、erode

cv2.erode(scr,kernel,iterations)

scr:原始圖像

kernel:卷積核,正方形,生成方式np.ones((5,5),np.uint8)

iteration:迭代次數,默認爲1

十八、dilate

cv2.dilate(scr,kernel,iterations)

scr:原始圖像

kernel:卷積核,正方形,生成方式np.ones((5,5),np.uint8)

iteration:迭代次數,默認爲1

十九、morphologyEx

開運算就是先腐蝕再膨脹,去掉噪聲在還原

cv2.morphologyEx(img,cv2.MORPH_OPEN, kernel)

cv2.MORPH_OPEN:開運算

 

閉運算先膨脹再腐蝕

cv2.morphologyEx(img,cv2.MORPH_CLOSE, kernel)

cv2.MORPH_CLOSE:閉運算

 

梯度操作

梯度=膨脹-腐蝕

得到圖像輪廓

cv2.morphologyEx(img,cv2.MORPH_GRADIENT, kernel)

cv2.MORPH_GRADIENT:梯度操作

 

禮帽操作

禮帽操作=原始圖像-開運算圖像

最終得到的就是噪聲

cv2.morphologyEx(img,cv2.MORPH_TOPHAT, kernel)

cv2.MORPH_TOPHAT:禮帽操作

 

黑帽操作

黑帽操作=閉運算-原始輸入

最終得到的就是噪聲

cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)

cv2.MORPH_BLACKHAT:黑帽操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章