首頁 > 軟體

python計算機視覺OpenCV入門講解

2022-06-27 22:01:53

前言

本專欄將非常細緻的講解相關與計算機視覺OpenCV的相關知識即操作,非常的簡單易懂。本文主要講解相關與計算機視覺的相關入門內容,關於影象處理的相關簡單操作,包括讀入影象、顯示影象及影象相關理論知識。

一、什麼是計算機視覺

計算機視覺是一門研究如何使機器“看”的科學,更進一步的說,就是是指用攝影機和電腦代替人眼對目標進行識別、跟蹤和測量等機器視覺,並進一步做圖形處理,使電腦處理成為更適合人眼觀察或傳送給儀器檢測的影象。作為一個科學學科,計算機視覺研究相關的理論和技術,試圖建立能夠從影象或者多維資料中獲取‘資訊’的人工智慧系統。這裡所指的資訊指Shannon定義的,可以用來幫助做一個“決定”的資訊。因為感知可以看作是從感官訊號中提取資訊,所以計算機視覺也可以看作是研究如何使人工系統從影象或多維資料中“感知”的科學。
視覺是各個應用領域,如製造業、檢驗、檔案分析、醫療診斷,和軍事等領域中各種智慧/自主系統中不可分割的一部分。由於它的重要性,一些先進國家,例如美國把對計算機視覺的研究列為對經濟和科學有廣泛影響的科學和工程中的重大基本問題,即所謂的重大挑戰(grand challenge)。計算機視覺的挑戰是要為計算機和機器人開發具有與人類水平相當的視覺能力。機器視覺需要圖象訊號,紋理和顏色建模,幾何處理和推理,以及物體建模。一個有能力的視覺系統應該把所有這些處理都緊密地整合在一起。

我們目前如果是在校學生,對於計算機視覺和機器學習的相關知識的學習是非常有用的,無論是對於自己的工作前景還是相關論文的撰寫都是非常有用的,而且目前對於計算機的相關知識已經設計到了各個專業領域,其中包括醫學領域(計算機視覺分析CT成像)、電學領域(使用matlab及相關領域畫圖)、臉部辨識和車牌識別等等。而且有想要做交叉學科的對於計算機可以和任意領域及進行無障礙交叉。
由於我這個理工男的語文功底並不好,語言組織能力不強,所以我們今天就囉嗦到這裡,總結一下就是計算機視覺及機器學習等和計算機相關的東西特別重要!

二、圖片處理基礎操作

首先我們來看一段簡單的計算機視覺相關程式碼:

import cv2
img=cv2.imread('path')#path指圖片相關路徑
cv2.imshow('Demo',img)
cv2.nameWindow('Demo')
cv2.waitKey(0)
cv2.destroyAllWindows()

這段程式碼就可以在計算機中顯示出img的相關影象。接下來我們講解一下每一步的相關操作。

圖片處理:讀入影象

相關函數:image=cv2.imread(檔名相關路徑[顯示控制引數])
檔名:完整的路徑。
其中引數包括:
cv.IMREAD_UNCHANGED :表示和原影象一致
cv.IMREAD_GRAYSCALE : 表示將原影象轉化為灰色影象。
cv.IMREAD_COLOR:表示將原影象轉化為彩色影象。
例如:
cv2.imread(‘d:image.jpg’,cv.IMREAD_UNCHANGED)

圖片處理:顯示影象

相關函數:None=cv2.imshow(視窗名,影象名)
例如:cv2.imshow(“demo”,image)
但是在OpenCV中我們影象顯示還是要加上相關約束:
retval=cv2.waitKey([delay])
如果沒有這個限制,那麼顯示的影象就會一閃而過,就會發生錯誤。
其中delay引數包括:
dealy=0,無限等待影象顯示,直到關閉。也是waitKey的預設數值。
delay<0,等待鍵盤點選結束影象顯示,也就是說當我們敲擊鍵盤的時候,影象結束顯示。
delay>0,等待delay毫秒後結束影象顯示。
最後我們還需要顯示
cv2.destroyAllWindows()
把影象從記憶體中徹底刪除。

圖片處理:影象儲存

相關函數:retval=cv2.imwrite(檔案地址,檔名)
例如:
cv2.imwrite(‘D:test.jpg’,img)
將img儲存到了路徑D:test.jpg

三、影象處理入門基礎

影象成像原理介紹

首先我們第一個要深深深深的刻在腦子裡的概念就是:

圖片是由畫素點構成的:

生動一點表示就是這樣:

這樣就可以完美的展示出計算機影象的成像原理,就是用一個個有顏色的畫素點拼接而成的。

影象分類

影象一般分為三類:
一、二值影象
二值影象表示的意思就是每一個畫素點只由0和1構成,0表示黑色,1表示白色,而且這裡的黑色和白色是純黑和純白。所以我們看到的影象也就是這個樣子。我們以官網麗娜為例子。

四、灰度影象

灰度影象就是一個8位元的點陣圖。什麼意思呢?就是說00000001一直到11111111,這就是二進位制表示。如果表示成我們常用的十進位制就是0-255。其中0就表示純黑色,255就表示純白色,中間就是處於純黑色到純白色的相關顏色。我們還是以麗娜為例。

灰度影象一塊畫素點:

五、彩色影象(RGB)

計算機中所有的顏色都可以由R(紅色通道)、G(綠色通道)、B(藍色通道)來組成,其中每一個通道都有0-255個畫素顏色組成。比如說R=234,G=252,B=4就表示黃色。顯示出來的也是黃色。所以說彩色影象由三個面構成,分別對應R,G,B。我們還是以麗娜為例子:

所以說我們就可以知道複雜程度排序的話就是:彩色影象-灰度影象-二值影象。所以我們在進行人臉專案或者是車牌識別專案中最最最常用的操作就是將彩色影象轉化為灰度影象,然後將灰度影象轉為最簡單的二值影象。

六、畫素處理操作

讀取畫素

相關函數:返回值=影象(位置引數) 我們先以灰度影象,返回灰度值:
p=img[88,142]
print§
這裡我們就可以返回圖片座標[88,142]處的灰度值。
然後我們以彩色影象為例子:
我們知道彩色影象由BGR三個通道的值構成。那麼我們需要返回三個數值:
blue=img[78,125,0]
green=img[78,125,1]
red=img[78,125,2]
print(blue,green,red)
這樣我們就返回了這三個數值。

修改畫素

直接暴力修改。
對於灰度影象, 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的這個區間全部用白色替代。

使用python中的numpy修改畫素點

讀取畫素:

相關函數:返回值=影象.item(位置引數)
我們以灰度影象為例:
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(位置,新的數值)
我們以灰度影象為例子:
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可以獲取影象的形狀,返回值包含行數、列數通道數的元組。
灰度影象返回行數列數
彩色影象返回行數、列數、通道數。

import cv2
img1=cv2.imread('灰度影象')
print(img1.shape)

畫素數目

size可以獲取影象的畫素數目。
灰度影象:行數列數
彩色影象:行數列數*通道數

影象型別

dtype返回的是影象的資料型別

import cv2
img=cv2.imread('影象名稱')
print(img.dtype)

八、影象ROI

ROI(region of interest)表示感興趣區域

從被處理的影象中以方框、圓、橢圓或者不規則多邊形等方式勾勒出需要處理的區域。可以通過各種運算元(operator)和函數來求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中有專門拆分通道的函數:
cv2.split(img)

import cv2
import numpy as np
a=cv2.imread("imagelenacolor.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("imagelenacolor.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 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com