python opencv,讀取彩色影象,提取三通道,影象二值化,提取影象的邊緣
python opencv,讀取彩色影象,提取三通道,影象二值化,提取影象的邊緣
python opencv
1,讀取影象
2,影象變矩陣
3,影象轉灰度影象
4,彩色影象是3D陣列
5,灰度影象是2D陣列
6,彩色影象是3個2D陣列
7,彩色影象有3個通道,提取3個通道
#Copyright
‘’‘
熟悉opencv庫
’‘’
import
cv2
import
numpy
as
np
img
=
cv2
。
imread
(
‘D:/python_examples/mei_hua1。jpeg’
)
‘’‘顯示彩色影象 ’‘’
#cv2。imshow(“img”,img)
#cv2。waitKey(0)
gray
=
cv2
。
cvtColor
(
img
,
cv2
。
COLOR_BGR2GRAY
)
‘’‘ 顯示灰度影象’‘’
#cv2。imshow(“gray”,gray)
#cv2。waitKey(0)
‘’‘得到了影象的大小 ’‘’
rows
,
cols
,
_
=
img
。
shape
(
rows
,
cols
)
‘’‘初始化一個大小一樣的影象,元素初始化為0 ’‘’
created
=
np
。
zeros
((
rows
,
cols
))
‘’‘ for in 語句,遍歷陣列,但不能修改陣列’‘’
for
i
in
img
:
for
j
in
i
:
#print(j)
pass
‘’‘給陣列賦值 ’‘’
for
i
in
range
(
0
,
rows
):
for
j
in
range
(
0
,
cols
):
created
[
i
,
j
]
=
img
[
i
,
j
,
2
]
#第三個引數,可以是0,1,2分別表示3個通道
(
created
。
shape
)
#建立的影象大小
‘’‘必須加這一條語句,否則無法正確顯示影象 ’‘’
created
=
created
。
astype
(
np
。
uint8
)
#轉換型別,才能正確的顯示影象
cv2
。
imshow
(
‘created’
,
created
)
cv2
。
imwrite
(
‘D:/python_examples/created。jpg’
,
created
)
cv2
。
waitKey
(
0
)
通道0
通道1
通道2
總結:
1個彩色影象,可以分解為3個灰度影象
3個灰度影象合起來是一個彩色影象
通道2影象,觀察到花很白。如果
影象很白,說明對應的畫素值大。
所以,做一個二值處理。
當畫素值大於180,顯示255
當畫素值小於等於180,顯示為0
created[created>180]=255
created[created<=180]=0
、
這個影象就是2值影象。
什麼是2值影象,就是裡面只有黑和白。
通道3變成了2值影象以後,有什麼變化。
在通道3,
看到有花,有枝條,有朦朧的一個背景。
在二值影象,
就看到了花。
花尾巴部分,變成了白色,原來是灰色。
枝條沒有了。
朦朧的背景也沒有了
所以,二值影象,消除了枝條。
消除了朦朧的背景。
只顯示了我們關心的花。
仔細觀察影象變化,很重要!
對於二值影象,顯示邊緣。
什麼是邊緣。
舉例:
000011100
左邊連續的0,都是黑
所以0-0=0
右邊-左邊
01
左邊是0,右邊是1
這裡就是邊緣了
右邊-左邊=1
111連續的1,都是白色
10
這裡是邊緣,因為從1變0
00
都是黑
按照這個道理。
修改二值影象,提取邊緣
for i in range(0,rows):
for j in range(0,cols-1):
#created[i,j]=created[i,j+1]-created[i,j]# 0-0 255-255 255-0 0-255
if(created[i,j+1]<=created[i,j]):
created[i,j]=0
else:
created[i,j]=255
現在影象裡面,只有一些白色的線條。
白色的面積小了很多了。
而且這些白色線條,組成了花的輪廓。
for
i
in
range
(
0
,
rows
):
for
j
in
range
(
0
,
cols
-
1
):
#created[i,j]=created[i,j+1]-created[i,j]# 0-0 255-255 255-0 0-255
if
(
created
[
i
,
j
+
1
]
>=
created
[
i
,
j
]):
created
[
i
,
j
]
=
0
else
:
created
[
i
,
j
]
=
255
讀者可以更換其他影象試試,看看效果
總結:
對影象處理的步驟
1,彩色影象
2,提取3個通道
3,把第三通道的影象做二值化,閾值自己可以調整的
4,把二值化影象,提取了邊緣