OpenCV-Python 图像处理(三):图像的基本操作
说明:
- 本系列主要是学习OpenCV-Python文档的个人笔记。
- 很少有理论的叙述,都是函数名、参数描述、作用、应用场景、代码、效果图。简单明了,即学即用。
1、获取并修改像素值
函数:img[] #不严格
参数:无
作用:如题
应用场景:不知道怎么描述,你懂得。
import cv2
img=cv2.imread('F:\\temp\\color.jpg')
px=img[180,180] #图像是个矩阵,所有通道的第180行,180列的像素值
print(px)
blue=img[180,180,2] #第三通道(B通道)的第180行,180列的像素值
print(blue)
img[180,180]=[255,255,255] #修改像素值,3个通道的都改了
print(img[180,180])
## [255 255 255]
2、图像 ROI
函数:img[] #不严格
参数:无
作用:对一幅图像的特定区域进行操作
应用场景:举个栗子,检测一副图像眼睛位置时,先找脸,再基于脸(ROI)找眼睛,而不是基于整幅图像找眼睛,这样可以提高程序的准确性和性能。
代码如下(可复制):
import cv2
img=cv2.imread('F:\\temp\\color.jpg')
roi=img[180:260,320:400] #长80,宽80
img[177:257,120:200]=roi #长80,宽80
img=cv2.imshow('test', img)
cv2.waitKey(0)
效果图如下:
3、拆分及合并图像通道
函数:cv2.split() , cv2.merge()
参数:图像矩阵变量
作用:如题
应用场景:不知道怎么描述,你懂得。
代码如下(可复制):
img=cv2.imread('F:\\temp\\color.jpg')
r,g,b=cv2.split(img) #拆分
img=cv2.merge(r,g,b) #合并
#或者
r=img[:,:,0]
g=img[:,:,1]
b=img[:,:,2]
#假如你想使所有像素的红色通道值都为 0,你不必先拆分再赋值。你可以直接使用 Numpy 索引,这会更快。
img[:,:,0]=0
警告:cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用Numpy 索引就尽量用。
4、为图像扩边(填充)
函数:cv2.copyMakeBorder()
参数:• src 输入图像
• top, bottom, left, right 对应边界的像素数目。
• borderType 要添加哪种类型的边界,类型如下:
– cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
– cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcde-fgh|hgfedcb
– cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
– cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh
– cv2.BORDER_WRAP 像这样: cdefgh|abcdefgh|abcdefg
• value 边界颜色,前提是边界的类型是 cv2.BORDER_CONSTANT
作用:在图像周围创建一个边,像个相框一样。
应用场景:经常在卷积运算或 0 填充时被用到
代码如下(可复制):
import cv2
from matplotlib import pyplot as plt #画图用的
BLUE=[0,0,255]
img1=cv2.imread('F:\\temp\\3.jpg')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
#可视化上面的图
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL'),plt.axis('off')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE'),plt.axis('off')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT'),plt.axis('off')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101'),plt.axis('off')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP'),plt.axis('off')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT'),plt.axis('off')
plt.show()
#打印出它们的shape看看是不是在img1的基础上加了10
print(img1.shape,replicate.shape,reflect.shape,wrap.shape,constant.shape)
效果如图:
上一篇: elasticsearch-2.1.0集群搭建 及其出现的一些问题
下一篇: 实现一颗红黑树