python計算機視覺OpenCV入門講解
前言
本專欄將非常細致的講解相關與計算機視覺OpenCV的相關知識即操作,非常的簡單易懂。本文主要講解相關與計算機視覺的相關入門內(nèi)容,關于圖像處理的相關簡單操作,包括讀入圖像、顯示圖像及圖像相關理論知識。
一、什么是計算機視覺
計算機視覺是一門研究如何使機器“看”的科學,更進一步的說,就是是指用攝影機和電腦代替人眼對目標進行識別、跟蹤和測量等機器視覺,并進一步做圖形處理,使電腦處理成為更適合人眼觀察或傳送給儀器檢測的圖像。作為一個科學學科,計算機視覺研究相關的理論和技術,試圖建立能夠從圖像或者多維數(shù)據(jù)中獲取‘信息’的人工智能系統(tǒng)。這里所指的信息指Shannon定義的,可以用來幫助做一個“決定”的信息。因為感知可以看作是從感官信號中提取信息,所以計算機視覺也可以看作是研究如何使人工系統(tǒng)從圖像或多維數(shù)據(jù)中“感知”的科學。
視覺是各個應用領域,如制造業(yè)、檢驗、文檔分析、醫(yī)療診斷,和軍事等領域中各種智能/自主系統(tǒng)中不可分割的一部分。由于它的重要性,一些先進國家,例如美國把對計算機視覺的研究列為對經(jīng)濟和科學有廣泛影響的科學和工程中的重大基本問題,即所謂的重大挑戰(zhàn)(grand challenge)。計算機視覺的挑戰(zhàn)是要為計算機和機器人開發(fā)具有與人類水平相當?shù)囊曈X能力。機器視覺需要圖象信號,紋理和顏色建模,幾何處理和推理,以及物體建模。一個有能力的視覺系統(tǒng)應該把所有這些處理都緊密地集成在一起。
我們目前如果是在校學生,對于計算機視覺和機器學習的相關知識的學習是非常有用的,無論是對于自己的工作前景還是相關論文的撰寫都是非常有用的,而且目前對于計算機的相關知識已經(jīng)設計到了各個專業(yè)領域,其中包括醫(yī)學領域(計算機視覺分析CT成像)、電學領域(使用matlab及相關領域畫圖)、人臉識別和車牌識別等等。而且有想要做交叉學科的對于計算機可以和任意領域及進行無障礙交叉。
由于我這個理工男的語文功底并不好,語言組織能力不強,所以我們今天就啰嗦到這里,總結一下就是計算機視覺及機器學習等和計算機相關的東西特別重要!
二、圖片處理基礎操作
首先我們來看一段簡單的計算機視覺相關代碼:
import cv2 img=cv2.imread('path')#path指圖片相關路徑 cv2.imshow('Demo',img) cv2.nameWindow('Demo') cv2.waitKey(0) cv2.destroyAllWindows()
這段代碼就可以在計算機中顯示出img的相關圖像。接下來我們講解一下每一步的相關操作。
圖片處理:讀入圖像
相關函數(shù):image=cv2.imread(文件名相關路徑[顯示控制參數(shù)])
文件名:完整的路徑。
其中參數(shù)包括:
cv.IMREAD_UNCHANGED :表示和原圖像一致
cv.IMREAD_GRAYSCALE : 表示將原圖像轉化為灰色圖像。
cv.IMREAD_COLOR:表示將原圖像轉化為彩色圖像。
例如:
cv2.imread(‘d:\image.jpg’,cv.IMREAD_UNCHANGED)
圖片處理:顯示圖像
相關函數(shù):None=cv2.imshow(窗口名,圖像名)
例如:cv2.imshow(“demo”,image)
但是在OpenCV中我們圖像顯示還是要加上相關約束:
retval=cv2.waitKey([delay])
如果沒有這個限制,那么顯示的圖像就會一閃而過,就會發(fā)生錯誤。
其中delay參數(shù)包括:
dealy=0,無限等待圖像顯示,直到關閉。也是waitKey的默認數(shù)值。
delay<0,等待鍵盤點擊結束圖像顯示,也就是說當我們敲擊鍵盤的時候,圖像結束顯示。
delay>0,等待delay毫秒后結束圖像顯示。
最后我們還需要顯示
cv2.destroyAllWindows()
把圖像從內(nèi)存中徹底刪除。
圖片處理:圖像保存
相關函數(shù):retval=cv2.imwrite(文件地址,文件名)
例如:
cv2.imwrite(‘D:\test.jpg’,img)
將img保存到了路徑D:\test.jpg
三、圖像處理入門基礎
圖像成像原理介紹
首先我們第一個要深深深深的刻在腦子里的概念就是:
圖片是由像素點構成的:
生動一點表示就是這樣:
這樣就可以完美的展示出計算機圖像的成像原理,就是用一個個有顏色的像素點拼接而成的。
圖像分類
圖像一般分為三類:
一、二值圖像
二值圖像表示的意思就是每一個像素點只由0和1構成,0表示黑色,1表示白色,而且這里的黑色和白色是純黑和純白。所以我們看到的圖像也就是這個樣子。我們以官網(wǎng)麗娜為例子。
四、灰度圖像
灰度圖像就是一個8位的位圖。什么意思呢?就是說00000001一直到11111111,這就是二進制表示。如果表示成我們常用的十進制就是0-255。其中0就表示純黑色,255就表示純白色,中間就是處于純黑色到純白色的相關顏色。我們還是以麗娜為例。
灰度圖像一塊像素點:
五、彩色圖像(RGB)
計算機中所有的顏色都可以由R(紅色通道)、G(綠色通道)、B(藍色通道)來組成,其中每一個通道都有0-255個像素顏色組成。比如說R=234,G=252,B=4就表示黃色。顯示出來的也是黃色。所以說彩色圖像由三個面構成,分別對應R,G,B。我們還是以麗娜為例子:
所以說我們就可以知道復雜程度排序的話就是:彩色圖像-灰度圖像-二值圖像。所以我們在進行人臉項目或者是車牌識別項目中最最最常用的操作就是將彩色圖像轉化為灰度圖像,然后將灰度圖像轉為最簡單的二值圖像。
六、像素處理操作
讀取像素
相關函數(shù):返回值=圖像(位置參數(shù)) 我們先以灰度圖像,返回灰度值:
p=img[88,142]
print§
這里我們就可以返回圖片坐標[88,142]處的灰度值。
然后我們以彩色圖像為例子:
我們知道彩色圖像由BGR三個通道的值構成。那么我們需要返回三個數(shù)值:
blue=img[78,125,0]
green=img[78,125,1]
red=img[78,125,2]
print(blue,green,red)
這樣我們就返回了這三個數(shù)值。
修改像素
直接暴力修改。
對于灰度圖像, img[88,99]=255
對于彩色圖像,
img[88,99,0]=255
img][88,99,1]=255
img[88,99,2]=255這里也可以寫成
img[88,99]=[255,255,255]等同于上方。
改動多個像素點
例如還是以彩色圖像為例子:
i[100:150,100:150]=[255,255,255]
意思也就是將圖像橫坐標100到150和縱坐標100到150的這個區(qū)間全部用白色替代。
使用python中的numpy修改像素點
讀取像素:
相關函數(shù):返回值=圖像.item(位置參數(shù))
我們以灰度圖像為例:
o=img,item(88,142)
print(o)
對于彩色圖像我們還是:
blue=img.item(88,142,0)
green=img.item(88,142,1)
red=img.item(88,142,2)
然后print(blue,green,red)
修改像素:
圖像名.itemset(位置,新的數(shù)值)
我們以灰度圖像為例子:
img.itemset((88,99),255)
對于BGR圖像:
img.itemset((88,99,0),255)
img.itemset((88,99,1),255)
img.itemset((88,99,2),255)
import cv2 import numpy as np i=cv2.imread('path',cv2.IMREAD_UNCHANGED) print(i.item(100,100)) i.itemset((100,100),255) print(i,item(100,100))
通過這段代碼我們就可以看得出來像素的更改。
對于彩色圖像也是一樣。
七、獲取圖像屬性
形狀
shape可以獲取圖像的形狀,返回值包含行數(shù)、列數(shù)通道數(shù)的元組。
灰度圖像返回行數(shù)列數(shù)
彩色圖像返回行數(shù)、列數(shù)、通道數(shù)。
import cv2 img1=cv2.imread('灰度圖像') print(img1.shape)
像素數(shù)目
size可以獲取圖像的像素數(shù)目。
灰度圖像:行數(shù)列數(shù)
彩色圖像:行數(shù)列數(shù)*通道數(shù)
圖像類型
dtype返回的是圖像的數(shù)據(jù)類型
import cv2 img=cv2.imread('圖像名稱') print(img.dtype)
八、圖像ROI
ROI(region of interest)表示感興趣區(qū)域
從被處理的圖像中以方框、圓、橢圓或者不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域??梢酝ㄟ^各種算子(operator)和函數(shù)來求ROI,并進行下一步操作。
import cv2 import numpy as np a=cv2.imread('path') b=np.ones((101,101,3)) b=a[220:400,250:350] a[0:101,0:101]=b cv2.imshow('o',a) cv2.waitKey() cv2.destroyAllWindows()
我們還可以將感興趣的圖像加入到別的圖像當中。
九、通道的拆分與合并
拆分
import cv2 img=cv2.imread('圖像名') b = img[ : , : , 0 ] g = img[ : , : , 1 ] r = img[ : , : , 2 ]
我們在OpenCV中有專門拆分通道的函數(shù):
cv2.split(img)
import cv2 import numpy as np a=cv2.imread("image\lenacolor.png") b,g,r=cv2.split(a) cv2.imshow("B",b) cv2.imshow("G",g) cv2.imshow("R",r) cv2.waitKey() cv2.destroyAllWindows()
合并
import cv2 import numpy as np a=cv2.imread("image\lenacolor.png") b,g,r=cv2.split(a) m=cv2.merge([b,g,r]) cv2.imshow("merge",m) cv2.waitKey() cv2.destroyAllWindows()
我們將上方的拆分圖像進行merge合并就可以得到以下結果:
到此這篇關于python計算機視覺OpenCV入門講解的文章就介紹到這了,更多相關python OpenCV 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C# DataGridView行列轉換的具體實現(xiàn)
本文主要介紹了C# DataGridView行列轉換的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02tensorflow入門之訓練簡單的神經(jīng)網(wǎng)絡方法
本篇文章主要介紹了tensorflow入門之訓練簡單的神經(jīng)網(wǎng)絡方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Python+MediaPipe實現(xiàn)檢測人臉功能詳解
MediaPipe是用于構建多模態(tài)(例如視頻、音頻或任何時間序列數(shù)據(jù))、跨平臺(即eAndroid、IOS、web、邊緣設備)應用ML管道的框架。本文將利用MediaPipe實現(xiàn)檢測人臉功能,需要的可以參考一下2022-02-02一文教會你用nginx+uwsgi部署自己的django項目
uWSGI是一個Web服務器,它實現(xiàn)了WSGI協(xié)議、uwsgi、http等協(xié)議,下面這篇文章主要給大家介紹了關于用nginx+uwsgi部署自己的django項目的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08pytorch torch.expand和torch.repeat的區(qū)別詳解
這篇文章主要介紹了pytorch torch.expand和torch.repeat的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11Python調(diào)用API接口實現(xiàn)人臉識別
本文主要介紹了Python調(diào)用API接口實現(xiàn)人臉識別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02