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
print(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个通道
print(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,把二值化图像,提取了边缘