基於Python的Opencv學習

基於Python的Opencv學習第三天

各位小夥伴們大家好,今天是我學習Opencv的第三天,從第一篇博客開始到現在是第三篇博客了,介紹的都是比較基礎的,我個人感覺就是因爲比較基礎我纔給記錄下來,因爲基礎的函數或者概念我們才用的最多,好啦,話不多說,繼續學習吧!!!

一.使用numpy包來訪問像素

在之前我的博客裏面是在import cv2裏面直接讀取像素然後對像素進行處理的,今天我們學一個不一樣的,就是使用numpy包來訪問像素。

1.讀取像素
在這裏用numpy包讀取像素的方法和直接讀取像素不同,我們需要用item()函數來讀取像素。具體使用方法如下:

返回值=圖像.item(位置參數)

對於兩種圖像(灰度圖和彩色圖)有兩種不同的返回值。

灰度圖 返回灰度值
彩色圖 返回值爲B,G,R的值

示例:
灰度圖 p=img.item(88,142)
彩色圖 blue=img.item(78,125,0)
green=img.item(78,125,1)
red=img.item(78,125,2)

在這裏,img爲我定義的圖像的名稱,然後調用了item()函數,在灰度圖裏面,兩個數據直接是像素座標,彩色圖裏面多了第三個是通道的值(至於像素座標和通道,如果有不理解的小夥伴,可以看我前兩篇博客來了解一下)。

2.修改像素

修改像素我們需要用到itemset()函數,具體使用語法如下:

圖像名.itemset((位置x座標,位置y座標),新值)

來看示例:
灰度圖 img.itemset((88,99),255)
彩色圖 img.itemset((88,99,0),255)

在這裏我就不過多贅述,看語法和示例就能明白每個數字含義。

>>> import cv2
>>> import numpy as np
>>> i=cv2.imread(r"C:\Users\LT010407\Desktop\0.jpg")
>>> print(i.item(100,100,1))
30
>>> i.itemset((100,100,1),255)
>>> print(i.item(100,100,1))
255
>>> 

在這裏插入圖片描述
在這裏我在idle上面運行了代碼,小夥伴們可以看到結果已經很好的展示在了我們的idle上面。

剛剛介紹了用numpy包來對像素進行操作,感覺還是在介紹老的知識點,小夥伴們彆着急,現在我立馬介紹一個新的東西,肯定能夠讓你們產生興趣。

二.圖像ROI

1.圖像ROI是什麼
ROI中文是感興趣區域,指從被處理的圖像以方框,圓,橢圓,不規則多邊形等方式勾勒出需要處理的區域,可以通過各種算子和函數來求得感興趣區域ROI,並進行圖像的下一步處理。文字還是表達不清楚,還是用代碼來解釋一下可能更容易理解。

import cv2
img=cv2.imread(“圖像名稱”)
face=img[200:400,200:400]

在這裏插入圖片描述

如上圖,黃色的是我們調用的那張圖像,藍色的範圍(座標已經給出)是指我們感興趣區域(即ROI),再結合代碼就能明白,我們取出感興趣區域的圖像(藍色區域)賦給了face。
我相信這麼一說大家更能夠理解什麼是ROI了吧。

2.圖像ROI的語法
至於語法,在剛剛介紹中我好像全給說完了,哈哈哈。這樣吧,直接上代碼吧,就能夠看的更明白。

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\1.jpg")
>>> face=img[200:400,200:400]
>>> cv2.imshow("picture1",img)
>>> cv2.imshow("face",face)
>>> 

在這裏插入圖片描述
這裏是我們的代碼,小夥伴們可以先思考一下會發生什麼情況。

鐺鐺鐺,我們來揭曉結果把。
在這裏插入圖片描述
這個是我命名的picture1的圖像,一張很好看的風景圖。
在這裏插入圖片描述
這個是我命名face的一張圖像,取自那個picture1圖像的200到400行和200到400列的所有像素點組成的圖像,這下小夥伴們明白了圖像ROI的語法了吧。

可能有小夥伴會問,我都取出來了一塊圖像,那我能不能給這個圖像加在原圖的任意位置呢,答案是肯定可以的,而且我們不僅僅可以給這個感興趣區域的圖像取出來放到原圖裏面去,還可以給這張圖像放到任何一張圖像裏面,大家請往下看。
在這裏我們可以直接進行圖像ROI的選取,然後直接進行賦右值就可以改變圖像。先來看代碼。

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> pic=cv2.imread(r"C:\Users\LT010407\Desktop\3.jpg")
>>> face=img[100:200,100:200]
>>> pic[150:250,120:220]=face
>>> img[0:100,0:100]=face
>>>> cv2.imshow("img",img)
>>> cv2.imshow("pic",pic)
>>> 

在這裏插入圖片描述
在這裏插入圖片描述
在這裏我們可以看到,我分別截取了那個皮卡丘的眼睛然後先在皮卡丘那張圖片上覆制到0:100行和0:100列,然後在第二幅風景圖紙150:250行和120:220列又再次進行復制。
其實大家看到這兒,估計對我們的這個圖像ROI已經有了充分的認識了,通俗一點來說就是先截取一段圖片,然後我們可以給這段圖片隨意指定位置或者直接在一個新窗口彈出,可以類別計算機裏面的copy和paste來理解。

三.通道的拆分與合併

1.通道的拆分
我們再來介紹一下,關於彩色圖通道的拆分。通道的拆分意味着什麼呢,首先,我們知道彩色圖是由B,G,R三個通道所構成的,那麼我們可以給這三個通道獨立出來就是拆分的過程。如果我們直接使用opencv來進行拆分,那麼可以用以下語法完成:

img=cv2.imread(“圖像名”)
b=img[ : , : ,0]
g=img[ : , : ,1]
r=img[ : , : ,2]

但是在opencv裏面有專門用來進行通道拆分的split()函數,來看一下語法:

一次性拆分:
img=cv2.imread(“圖像名”)
b,g,r=cv2.split(img)
將三個通道拆分出來後可以得到三個灰度圖像
來看一下代碼和結果:

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b,g,r=cv2.split(img)
>>> cv2.imshow("B",b)
>>> cv2.imshow("G",g)
>>> cv2.imshow("R",r)
>>> 

在這裏插入圖片描述
大家可以看到我現在已經給三個通道拆分了出來,分別得到三個不同的灰度圖像,這就是一次性拆分三個通道的代碼和結果展示。

除了一次性拆分還可以每次只得到一個通道來拆分,這裏就可以在split()函數後面加一個下標就可以實現:

img=cv2.imread(“圖像地址”)
b=cv2.split(img)[0]
g=cv2.split(img)[1]
r=cv2.split(img)[2]

如果只需要一個通道的圖像,那我們就不需要寫其他通道的代碼,至於代碼和實現結果和一次性拆分相似,這裏我就不贅述了。

2.通道的合併
有拆分肯定得給合併起來,這裏我們就用到merge()函數,具體語法如下:

img=cv2.imread(“圖像地址”)
b,g,r=cv2.split(img)
bgr=cv2.merge([b,g,r])

在這裏我們需要注意合併的順序,即[b,g,r]的順序,如果是寫反了[r,g,b]的順序的話,就無法得到我們想要的圖像。

來看代碼和結果展示:

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b,g,r=cv2.split(img)
>>> cv2.imshow("B",b)
>>> cv2.imshow("G",g)
>>> cv2.imshow("R",r)
>>> bgr=cv2.merge([b,g,r])
>>> rgb=cv2.merge([r,g,b])
>>> cv2.imshow("bgr",bgr)
>>> cv2.imshow("rgb",rgb)
>>> 

在這裏插入圖片描述
這個我們可以看到,如果我們合併的順序正確,那麼我們能夠得到一隻非常可愛的皮卡丘,但是如果合併順序出錯,那麼這個皮卡丘就變顏色了,也並不是我們想要的結果。

接下來我想再介紹一下拿任意一個通道與兩個等大的空白通道合併,來看看效果吧

>>> import cv2
>>> import numpy as np
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> rows,cols,chn=a.shape
>>> b=cv2.split(a)[0]
>>> g=np.zeros((rows,cols),a.dtype)
>>> r=np.zeros((rows,cols),a.dtype)
>>> m=cv2.merge([b,g,r])
>>> cv2.imshow("merge",m)
>>> 

這裏我想介紹一下zeros()函數,用法如下:
zeros(shape,dtype=float,order=‘C’)
返回值是得到一個給定形狀和類型的用0填充的數組
參數分析如下:
①shape:即該數組形狀(幾乘幾的矩陣)
②dtype:數據類型,有多種可選參數,默認numpy.float64
(此處爲了和原圖像參數保持一致,就直接用了a.dtype)
③order:可選參數,C代表與c語言類似,行優先;F代表列優先
在這裏插入圖片描述
這個是結果,顯示的是一大片藍色 ,如果不是隻用藍色通道,而只是分別用其他兩種顏色通道,得到的結果就是綠色和紅色,這裏就不再贅述。

好啦,今天講了很多了,我覺得有重要的地方,也有一些基礎的,當然總的來看,這還是基礎中的基礎,小夥伴們就先看看吧,畢竟我也是剛剛入門。大家共同進步吧!!!(轉載註明出處)

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