【圖像處理】基本概念

  • 目錄:
    • 1、什麼是opencv,它有哪些優勢?
    • 2、opencv 安裝和環境配置
    • 3、瞭解數字圖像的基本概念:像素、彩色圖像、灰度圖像、二值圖像、圖像算數操作
    • 4、練習numpy中array的基本操作
    • 5、練習圖像的加載、保存、以及算術操作

一、什麼是 opencv

​ OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。

​ 優勢:

計算機視覺市場巨大而且持續增長,且這方面沒有標準API,如今的計算機視覺軟件大概有以下三種:

​ 1、研究代碼(慢,不穩定,獨立並與其他庫不兼容)

​ 2、耗費很高的商業化工具(比如Halcon)

​ 3、依賴硬件的一些特別的解決方案(比如[視頻監控],製造[控制系統],醫療設備)這是如今的現狀,而標準的API將簡化計算機視覺程序和解決方案的開發,OpenCV致力於成爲這樣的標準API。

OpenCV致力於真實世界的實時應用,通過優化的C代碼的編寫對其執行速度帶來了可觀的提升,並且可以通過購買Intel的IPP高性能多媒體函數庫(Integrated Performance Primitives)得到更快的處理速度。右圖爲OpenCV與當前其他主流視覺函數庫的性能比較。(摘自百度百科)

二、opencv 安裝和配置

1. opencv-python的安裝

​ 默認已經配置好了python環境和科學計算必要的包如numpy。python下opencv的安裝相對比較簡單,只需要在命令行輸入以下指令即可自動安裝最新版的opencv庫

pip install opencv-python

​ 如果需要安裝之前版本的opencv,可以到 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 這個鏈接下搜索opencv並下載對應的版本,之後 pip inseall + opencv-python***.whl 即可。

2. linux下 opencv c++版的安裝

進入官網 : http://opencv.org/releases.html , 選擇需要版本的 source , 下載

解壓到需要安裝的路徑下

mkdir build # 創建編譯的文件目錄

cd build

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j8  #編譯

sudo make install #安裝

安裝完成之後通過查看opencv版本驗證是否安裝成功:

pkg-config --modversion opencv  

三、數字圖像的基本概念

1、分辨率:

指單位區域內包含的像素數目。單位爲像素/英寸(通用),簡寫爲 ppi2.像素/釐米
常見的分辨率:

1.圖像分辨率 

2.顯示分辨率 

3.輸出分辨率  

4.位分辨率

2、彩色圖像(RGB):

自然界中幾乎所有顏色都可以自紅(Red,R)、 綠(Green,G)、藍(Blue,B) 3種顏色組合,通常稱它們爲RGB三原色.
計算機顯示彩色圖像時採用最多的就是RGB模型。對於每個像素,通過控制R、G、B三原色的合成比例則可決定該像素的最終顯示顏色。將一幅圖像視爲一個二維函數f(x,y)外,其中x和y是空間座標,而在x-y平面中的任意一對空間座標(x,y)上的幅值f稱爲該點圖像的灰度、亮度或強度。此時,如果f(x,y)均爲非負有限離散,則稱該圖像爲數字圖像〈位圖〉。一個大小爲M×N的數字圖像是由M行N列的有限元素組成的,每個元素都有特定的位置和幅值,代表了其所在行列位置上的圖像物理信息,如灰度和色彩等。這些元素稱爲圖像元素或像素。

3、二值圖像

每個像素只有黑、自兩種顏色的圖像稱爲二值圖像。在二值圖像中,像素只有 0和1兩種取值,一般用0來表示黑色,用1表示白色。

4、灰度圖像

在二值圖像中進一步加入許多介於黑色與白色之間的顏色探度,就構成了灰度圖像。這類圖像通常顯示爲從最暗黑色到最亮的白色的灰度,每種灰度〈顏色深度〉稱爲一個灰度級,通常用L表示.在灰度圖像中,像素可以取 O~L-1之間的整數值,根據保存灰度數值所使用的數據類型的不同,可能有256種取值或者2k種取值,當k=1時即退化爲二值圖像.

5、圖像的算術操作

由上我們可以知道圖像可以看做是一個二維函數f(x,y)在空間的座標,也就是說,圖像上每個點都可以用函數f(x,y)來顯示出來,圖像的算術操作是陣列操作,即在相對應的像素對之間執行。

4種算術操作表示爲:

s(x, y) = f(x, y) + g(x, y);

d(x, y) = f(x, y) - g(x, y);

p(x, y) = f(x, y) × g(x, y);

v(x, y) = f(x, y) ÷ g(x, y);

處理圖像:

1.利用帶噪圖像的相加(平均)進行降噪處理。

2.利用圖像相減增強差別。

3.利用圖像相乘和相除來校正陰影。

四、numpy的基本操作

由於圖像可以看做三維矩陣(寬,高,通道數),這就可以用numpy來對圖像進行操作,一方面可以用來進行圖像的算術運算,另一方面可以把圖像看做矩陣進行矩陣的拆分與拼接等操作。

1、numpy對於矩陣的操作

矩陣加減乘除

針對以上的圖像的算數操作

import numpy as np
#創建兩個數組 a,b 並重置爲3*3的矩陣
a = np.arange(9, dtype = np.float_).reshape(3,3)
b = np.arange(9, dtype = np.float_).reshape(3,3)
# 矩陣相加,兩種方法,直接加或者使用numpy自帶的方法
print(a+b)
print(np.add(a+b))
# 矩陣相減
print(a-b)
print(np.subtract(a,b))  #使用自帶的方法時須注意減數和被減數的位置
# 矩陣相乘,這個方法是a,b中的元素分別每一項分別相乘,若需要求矩陣的值,numpy有點乘操作np.dot()
print(a*b)
print(np.multiply(a,b))
# 矩陣相除,使用除法時需要注意除數不能爲0
print(a/b)
print(np.divide(a,b))

2、numpy在圖像中的應用

在圖像處理中,常用到矩陣的剪切操作,對應的是圖片的剪切。可以從圖像的組成來理解,圖像是有三維矩陣組成的,每個維度對應的圖片的寬,高,通道數,所以可以將前兩維進行剪切來進行圖片的裁剪。
使用opencv讀取圖像後可以使用 img.shape 來獲取圖片的高(h),寬(w),通道數(n)(注意順序不能邊),對應的矩陣中img[寬,高,通道],順序不能搞錯,否則可能報數組越界的錯誤。

# 假設圖片爲1920*1080,需要剪切左上角像素爲100*150的小圖
roi = img[:150,:100]
# 獲取圖片的某一個點的像素,此時可以獲取(0,0)點的像素值,格式爲[g,b,r]
p = img[0][0]

五、圖片的基本操作

1.路徑中不含中文

# 讀取圖片
img = cv2.imread(imgPath)
# 保存圖片
cv2.imwrite("saveName",img)

直接使用 cv2.imread() 和cv2.imwrite() 方法即可

2.路徑中含有中文

路徑中含有中文時,需要編解碼才能讀取和保存

cv2.imdecode()函數從指定的內存緩存中讀取數據,並把數據轉換(解碼)成圖像格式;主要用於從網絡傳輸數據中恢復出圖像。

cv2.imencode()函數是將圖片格式轉換(編碼)成流數據,賦值到內存緩存中;主要用於圖像數據格式的壓縮,方便網絡傳輸。

# 讀取帶有中文的圖片
# 需要先進行編碼,才能讀取,使用numpy加載文件的格式進行加載,detype參數
# 爲讀取數據的類型,可以根據圖片類型進行選擇
img = cv2.imdecode(np.fromfile(img_Path,dtype=np.uint8),-1)
# 保存帶中文的圖片
cv2.imencode('.jpg', img)[1].tofile("imgName")

想到的很多,時間緊迫,先總結到這裏吧,後續補充。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章