opencv基本的图像操作

参考opencv官方文档OpenCV: Basic Operations on Images

加载图像,常用的方式是imread()函数,这个函数会返回一幅图像,而这个图像是一个数组,会根据imread()输入参数的不同,可能是一个三维数组或者二维数组。

numpy是经过优化了的进行快速矩阵运算的包,其中numpy.array结构针对数组操作有很好的优化,它可以允许bulk(块)操作,这些操作经常会在图像的处理上用到。

1.获取像素并修改像素

import cv2

import numpy

img = cv2.imread('MY_PIC.jpg')

px=img[100,100]

print(px)

blue = img[100,100,0]

print(blue)

img[101,101]=[255,255,255]

print(img[101,101])

numpy是经过优化了的进行快速矩阵运算的包,所以不推荐逐个获取像素值并修改能矩阵运算就不要用循环。例如前5行的后3列,用numpy的array.item()和array.itemset()会更好。但是返回是标量,如果想获得所有RGB的值,需要使用array.item()分割.

print(img.item(10,10,2))

img.itemset((10,10,2),100)

print(img.item(10,10,2))

2.获取图像属性

img.shape 获得图像的形状,返回值是一个包含行数,列数,通道数的元组

img.size可以返回图像的像素数目

 img.dtype返回图像的数据类型,在debug时很重要,因为OpenCV-Python代码中经常出现数据类型的不一致

3.对图像的特定区域操作。ROI是使用numpy索引来获得的

例:选择球的部分并拷贝到其他区域


ball = img[280:340, 330:390]

img[40:40,50:50]=ball

4.拆分及合并图像通道

有时需要拆分BGR为单个通道,对BGR三个通道分别操作。有时需要把独立的通道的图片合成一个BGR。

b,g,r = cv2.split(img)

img = cv2.merge((b,g,r))

 #拆分b通道

b = img[:,:,0]

# 假如想使所有红色通道值都为0,不必拆分再赋值,可以使用numpy索引,这样更快

img[:,:,2]=0

PS:cv2.split()是比较耗时的操作,能用numpy就尽量使用。

5.为图像扩边(填充)

想为图像周围建一个边可以使用cv2.copyMakeBorder()函数。这经常在卷积运算或0填充时被用到。具体参数如下:

5.1 src输入图像

5.2 top,bottom,left,right对应边界的像素数目

5.3 borderType要添加哪种类型的边界:

5.3.1 cv2.BORDER_CONSTANT添加有颜色的常数值边界,还需要下一个参数(value:边界颜色)

5.3.2 cv2.BORDER_REFLIECT边界元素的镜像。例如:fedcba | abcdefgh | hgfedcb

5.3.3 cv2.BORDER_101或者cv2.BORDER_DEFAULT跟上面一样,但稍作改动,例如:gfedcb | abcdefgh | gfedcba

5.3.4 cv2.BORDER_REPLICATE复后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh

5.3.5 cv2.BORDER_WRAP 就像这样: cdefgh| abcdefgh|abcdefg


运行结果图:


你可能感兴趣的:(opencv基本的图像操作)