OpenCV--对图片的基础操作

一、带着问题去学习?

1.1 如何获取图片像素,并对其修改?

1.2 如何获取图片属性?图片又有哪些属性?

1.3 如何获取区域图片?

1.4 如何对图片通道进行分割和合并?

1.5 如何对图片进行填充和延展?

 

二、

2.1 图片像素获取和修改

1 import cv2
2 import numpy as np
3 img = cv2.imread('F:/team.jpg')
4 px = img[100, 100]  #图片为二维数组,100*100表示横纵坐标,聚焦到一个点
5 print(px) # [157 166 200] 返回的是该点BGR各个值所组成的数组
6 
7 blue = img[100, 100, 0] # 第三个值0代表BGR通道中的B
8 print(blue) #157
9 #获取图片像素的另一种方式: item
10 img.item(100, 100, 0)
11
12 #更改像素的值
13 img.itemset((100, 100, 0) 100)

 

2.2 获取图片属性

1 img.shape #返回(长,宽,通道)
2 img.size #返回图片总像素数值
3 img.dtype #返回图片数据类型 

*注: 这里需要注意dtype属性,很多在OpenCV中发生的错误,都是因为数据类型错误,因此,Debug时,可以多检测它

 

2.3 获取区域图片

因为图片为二维数组,因此使用slice去划分区域

1 part = img[30:80, 30:80]
2 img[100:150, 100:150]  = part

 

2.4 图片通道分割和合并

两个API cv2.split() 和 cv2.merge()

1 b, g, r = cv2.split(img)
2 img = cv2.merge((b, g, r))
3 
4 b = img[:, :, 0]
5 img[:, : ,2] = 0

*注:cv2.split()是一个非常耗时的操作

 

2.5 图片延展

cv2. copyMakeBorder()

 1 import cv2
 2 import numpy as np
 3 from matplotlib import pyplot as plt
 4 BLUE = [255,0,0]
 5 img1 = cv2.imread('F:/team.jpg')
 6 
 7 replicate = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REPLICATE)
 8 reflect = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REFLECT)
 9 reflect101 = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REFLECT_101)
10 wrap = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_WRAP)
11 constant= cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_CONSTANT,value=BLUE)
12 
13 plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
14 plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
15 plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
16 plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
17 plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
18 plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
19 plt.show()

 

posted @ 2018-03-20 22:22  bellum  阅读(362)  评论(0编辑  收藏  举报