計算機視覺,影象
影象是人類視覺的基礎,是自然景物的客觀反映,是人類認識世界和人類本身的重要源泉。“圖”是物體反射或透射光的分佈,“像“是人的視覺系統所接受的圖在人腦中所形成的印象或認識。照片、繪畫、剪貼畫、地圖、書法作品、手寫漢學、傳真、衛星雲圖、影視畫面、X光片、腦電圖、心電圖等都是影象。
模擬影象和數字影象
影象,起源於於1826年前後法國科學家Joseph Nicéphore Niépce發明的第一張可永久儲存的照片,屬於模擬影象。模擬影象又稱連續影象,它透過某種物理量(如光、電等)的強弱變化來記錄影象亮度資訊,所以是連續變換的。模擬訊號的特點是容易受干擾,如今已經基本全面被數字影象替代。
在第一次世界大戰後,1921年美國科學家發明了Bartlane System,並從倫敦傳到紐約傳輸了第一幅數字影象,其亮度用離散數值表示,將圖片編碼成5個灰度級,透過海底電纜進行傳輸。在傳送端圖片被編碼並使用打孔帶記錄,透過系統傳輸後在接收方使用特殊的印表機恢復成影象。
1950年左右,計算機被髮明,數字影象處理學科正式誕生。
數字影象的表示,位數
計算機採用0/1編碼的系統,數字影象也是利用0/1來記錄資訊,平常接觸的影象都是8位數影象,包含:0~255灰度,其中0,代表最黑,1,表示最白。
人眼對灰度更敏感一些,在16位到32位之間。
數字影象的分類,二值影象、灰度圖和彩色圖
二值影象:
一幅二值影象的二維矩陣僅由0、1兩個值構成,“0”代表黑色,“1”代白色。由於每一畫素(矩陣中每一元素)取值僅有0、1兩種可能,所以計算機中二值影象的資料型別通常為1個二進位制位。二值影象通常用於文字、線條圖的掃描識別(OCR)和掩膜影象的儲存。
灰度圖:
每個畫素只有一個取樣顏色的影象,這類影象通常顯示為從最暗黑色到最亮的白色的灰度,儘管理論上這個取樣可以任何顏色的不同深淺,甚至可以是不同亮度上的不同顏色。灰度影象與黑白影象不同,在計算機影象領域中黑白影象只有黑色與白色兩種顏色;但是,灰度影象在黑色與白色之間還有許多級的顏色深度。灰度影象經常是在單個電磁波頻譜如可見光內測量每個畫素的亮度得到的,用於顯示的灰度影象通常用每個取樣畫素8位的非線性尺度來儲存,這樣可以有256級灰度(如果用16位,則有65536級)。
彩色圖:
每個畫素通常是由紅(R)、綠(G)、藍(B)三個分量來表示的,分量介於(0,255)。RGB影象與索引影象一樣都可以用來表示彩色影象。與索引影象一樣,它分別用紅(R)、綠(G)、藍(B)三原色的組合來表示每個畫素的顏色。但與索引影象不同的是,RGB影象每一個畫素的顏色值(由RGB三原色表示)直接存放在影象矩陣中,由於每一畫素的顏色需由R、G、B三個分量來表示,M、N分別表示影象的行列數,三個M x N的二維矩陣分別表示各個畫素的R、G、B三個顏色分量。RGB影象的資料型別一般為8位無符號整形,通常用於表示和存放真彩色影象。
OpenCV:Open Source Computer Vision Library
OpenCV
OpenCV是一款由Intel公司俄羅斯團隊發起並參與和維護的一個計算機視覺處理開源軟體庫,支援與計算機視覺和機器學習相關的眾多演算法,並且正在日益擴充套件。
OpenCV,基於Apache2.0許可(開源)發行的跨平臺計算機視覺和機器學習軟體庫,可執行在Linux、Windows、Android和Mac OS作業系統上,輕量級且高效,由一系列C函式和少量C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的介面,實現了影象處理和計算機視覺方面的很多通用演算法。
地址:https://opencv.org/,https://sourceforge.net/projects/opencvlibrary/files/
OpenCV的優勢
1、程式語言,OpenCV基於C++實現,同時提供python, Ruby, Matlab等語言的介面。OpenCV-Python是OpenCV的Python API,結合了OpenCV C++ API和Python語言的最佳特性。
2、跨平臺,可以在不同的系統平臺上使用,包括Windows,Linux,OS X,Android和iOS。基於CUDA和OpenCL的高速GPU操作介面也在積極開發中。
3、活躍的開發團隊。
4、豐富的API,完善的傳統計算機視覺演算法,涵蓋主流的機器學習演算法,同時添加了對深度學習的支援。
OpenCV的模組
其中core、highgui、imgproc是最基礎的模組:
1、core模組實現了最核心的資料結構及其基本運算,如繪圖函式、陣列操作相關函式等。
2、highgui模組實現了影片與影象的讀取、顯示、儲存等介面。
3、imgproc模組實現了影象處理的基礎方法,包括影象濾波、影象的幾何變換、平滑、閾值分割、形態學處理、邊緣檢測、目標檢測、運動分析和物件跟蹤等。
對於影象處理其他更高層次的方向及應用,OpenCV也有相關的模組實現
1、features2d模組用於提取影象特徵以及特徵匹配,nonfree模組實現了一些專利演算法,如sift特徵。
2、objdetect模組實現了一些目標檢測的功能,經典的基於Haar、LBP特徵的人臉檢測,基於HOG的行人、汽車等目標檢測,分類器使用Cascade Classification(級聯分類)和Latent SVM等。
3、stitching模組實現了影象拼接功能。
4、FLANN模組(Fast Library for Approximate Nearest Neighbors),包含快速近似最近鄰搜尋FLANN 和聚類Clustering演算法。
5、ml模組機器學習模組(SVM,決策樹,Boosting等等)。
6、photo模組包含影象修復和影象去噪兩部分。
7、video模組針對影片處理,如背景分離,前景檢測、物件跟蹤等。
8、calib3d模組即Calibration(校準)3D,這個模組主要是相機校準和三維重建相關的內容。包含了基本的多視角幾何演算法,單個立體攝像頭標定,物體姿態估計,立體相似性演算法,3D資訊的重建等等。
9、G-API模組包含超高效的影象處理pipeline引擎。
OpenCV的安裝(windows環境)
我的Windows安裝目錄:D:\Apps\MyTool\opencv
idea開發配置:
Java程式碼:
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class OpenCVMain {
static {
// 保證先執行該語句,用於載入庫
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
System.out.println("OpenCV版本:" + Core.VERSION);
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat mat = Mat.eye(3, 3, CvType.CV_8UC1);
System.out.println("mat=" + mat.dump());
}
}
輸出:
OpenCV版本:4.5.5
mat=[ 1, 0, 0;
0, 1, 0;
0, 0, 1]