基於Python的Opencv學習

基於Python的Opencv學習第二天

各位小夥伴們,大家好。這是我學習Opencv的第二天,今天算是正式認識一下Opencv的其他基礎的函數,我們立即開始把。

一.像素處理

1.讀取像素

返回值=圖像[位置參數]

這裏的返回值可以不需要,可以直接給圖像的位置參數,就可以獲得那個像素位置點的圖像。

讀取像素分灰度圖像彩色圖像,首先我們來看一下灰度圖像的讀取:

灰度圖像,返回灰度值
示例:

p=img[88,142]
print(p

該示例表示,如果我們將該img圖像看作一個由很多數字構成的矩陣,那麼我們訪問的就是該圖像的第88行142列的那個位置上的像素

BGR圖像,返回值爲B,G,R的值
示例:

第一種讀取BGR圖像像素的方法,返回值爲一個值
①blue=img[78,125,0]
print(blue)
②green=img[78,125,1]
print(green)
③red=img[78,125,2]
print(red)

因爲BGR圖像是有三個通道(可以參照我上篇博客對BGR圖像的介紹),那麼括號裏第三個數字代表我們選擇的是第幾個通道,如blue=img[78,125,0]這裏0就代表我們選取第一個通道的第78行第125列那個像素點(注意,這裏的三個通道單獨來看可以類比同灰度通道來理解,取出第一個通道,此時又構成了一個由很多數字構成的矩陣,我們僅僅在該矩陣進行取像素點的工作)。

第二種讀取BGR圖像像素的方法,返回值爲三個值
p=img[78,125]
print(p)

這裏我們讀取該BGR圖像第78行第125列的像素點,此時會得到三個數值,分別代表B,G,R三個通道上像素點的值。

2.修改像素
對讀取像素有了瞭解之後,修改像素就比較方便了,我們直接在讀到像素的那個點賦右值即可。

函數可以表示爲
圖像[位置參數]=想賦予的值

示例:

灰度圖像的修改像素:
img[88,99]=255

BGR圖像的修改像素:
①分通道修改:
img[88,99,0]=255
img[88,99,1]=255
img[88,99,2]=255

②不分通道修改:
img[88,99]=[255,255,255]

這裏我突然想強調一下右值必須是"[ ]“讀入和修改,並且在修改像素和讀入像素的同時也是採用”[ ]",如果大家對Python很熟悉,其實這是Python裏面的列表,Python用列表讀入數據。

光說不練可不行,一起來看效果把。

>>> import cv2
>>> i=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg",cv2.IMREAD_GRAYSCALE)
>>> cv2.imshow("orginal",i)
>>> i[100,100]=255
>>> print(i[100,100])
255
>>> cv2.imshow("result",i)
>>> i[100:1000,100:1000]=255
>>> print(i[100:1000,100:1000])
	[[255 255 255 ... 255 255 255]
	 [255 255 255 ... 255 255 255]
	 [255 255 255 ... 255 255 255]
	 ...
	 [255 255 255 ... 255 255 255]
	 [255 255 255 ... 255 255 255]
	 [255 255 255 ... 255 255 255]]
>>> cv2.imshow("result1",i)

這個代碼是先讀取像素,然後修改了[100,100]值爲255,但是由於我的圖片尺寸比較大,導致效果看不出來,於是我又給從100-1000位置的行和列改爲255,效果就很明顯了。
這是原圖
這是讀取的灰度圖片
這個是效果圖,就是給100:1000那個像素點全都變白了
上面三幅圖片分別是原圖,灰度圖,修改像素點後的圖片。

二.獲取像素屬性

1.形狀屬性
當我們想要了解一個圖像的形狀屬性時候,需要調用我們的shape函數,該函數可以獲取圖像的形狀,返回包含行數,列數,通道數的元組。

灰度圖 返回行數,列數
彩色圖 返回行數,列數,通道數

示例:
①img1=cv2.imread(灰度圖像)
print(img.shape)

得到返回值爲:>>>(512,512)

②img2=cv2.imread(彩色圖像)
print(img.shape)

得到返回值爲>>>(512,512,3)

在這裏我們分別得到兩種不同的返回值,其中灰度圖的返回值爲兩個512,可以類比理解爲一個完整的矩陣,他有512行和512列,而彩色圖也可以這樣理解,不同的是彩色圖的第三個數字3代表的是其通道數爲3,分別是R,G,B三個通道。

2.像素數目屬性
當我們想要了解一個圖像的像素數目屬性時候,需要調用我們的size函數,該函數可以獲取圖像的像素數目。

灰度圖 返回:行數×列數
彩色圖 返回:行數 ×列數×通道數

示例:
img=cv2.imread(圖像名)
print(img.size)

返回值是>>>786432

3.圖像類型屬性
當我們想要了解一個圖像的類型屬性時候,需要調用我們的dtype函數,這裏返回的是圖像的數據類型,此時沒有灰度圖和彩色圖區分,返回的都是數據類型。

示例:
img=cv2.imread(圖像名)
print(img.dtype)

返回值是>>>uint8

這裏uint8只不過是一個重定義,如果大家瞭解單片機就知道,單片機裏面全是uint8,uint16等,看似高大上,其實就是一個重定義。像這個uint8是8位無符號整型,uint16是16位無符號整型。
在這裏插入圖片描述
在這裏我用了單片機裏面的代碼說明,相信大家已經揭開了uint8的神祕面紗。

接下來,我直接上代碼和結果了

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\0.jpg",cv2.IMREAD_GRAYSCALE)
>>> print(img.shape)
(400, 400)
\
>>> print(img.size)
160000
>>> print(img.dtype)
uint8
>>> 

在這裏插入圖片描述
分別輸出的是圖像形狀,數目和圖像類型三個屬性。

今天講的比較簡單,全是一些非常非常基礎的知識,小夥伴們就當作休閒娛樂來看一下把!
(轉載註明出處)

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