python OpenCV 图像的基本操作
优质
小牛编辑
139浏览
2023-12-01
目标
- 访问像素值并修改它们
- 访问图像属性
- 设置图像区域(ROI)
- 分割和合并图像 本节中几乎所有的操作主要涉及到
Numpy
而不是OpenCV
。需要熟悉Numpy
才能用OpenCV
编写更好的代码。
1、获取并修改像素值
读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB
图像而言,返回RGB
的值,对于灰度图则返回灰度值
import cv2
import numpy
img = cv2.imread('45.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()
分割他们。 更好的方法是
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
2、获取图像属性
图像属性包括:行,列,通道,图像数据类型,像素数目等
2.1、img.shape可以获得图像的形状,返回值是一个包含行数,列数,通道数的元组
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.shape)
如果图像是灰度图,返回值仅有行数和列数,所以通过检查返回值可以判断是灰度图还是彩色图
2.2、img.size可以返回图像的像素数目
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.size)
2.3、img.dtype返回图像的数据类型,在debug时很重要,因为OpenCV-Python代码中经常出现数据类型的不一致
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.dtype)
3、图像ROI
对图像的特定区域操作。ROI
是使用numpy
索引来获得的。 例:选择球的部分并拷贝到其他区域
import cv2
import numpy
img = cv2.imread('roi.jpg')
ball =img[20:30,30:30]
img[40:40,50:50]=ball
注意!!这里没有找到原图,大家可以试试自己做的图,并且要先知道图像尺寸,以及你要移动的图像的像素坐标,可以使用
matplotlib
!
4、拆分及合并图像通道
有时需要对RGB三个通道分别操作,这就需要拆分RGB为单个通道。有时需要把独立的通道的图片合成一个RGB。
r,g,b=cv2.split(img)#拆分
img=cv2.merge(r,g,b)#合并
或者
b=img[:,:,0]#拆分b通道
假如想使所有红色通道值都为0,不必拆分再赋值,可以使用numpy
索引,这样更快
img[:,:,2]=0
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
- 5.3.6 value边界颜色 举例说明
import cv2
import numpy
from matplotlib import pyplot as plt
img = cv2.imread('roi.jpg')
blue = [255,0,0]
replicate = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT,value=blue)
plt.subplot(231),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')
plt.show()