python-opencv中的图像表示
OpenCV中图像读入的数据格式是numpy的ndarray数据格式。用数组描述图像。是BGR格式,取值范围是[0,255].
分为三个维度:
第一维度:Height 高度,对应图片的 行数
第二维度:Width 宽度,对应图片的 列数
第三维度:Value 代表BGR三通道的值 在opencv中,其中 0代表B,1代表G,2代表R
import cv2 as cv import numpy as np img = np.zeros((3, 2, 3), np.uint8)#三行两列3个通道 cv.imshow("image", img) k = cv.waitKey(0) & 0xFF
获取单一像素值和修改
方法一:直接访问
以下参数含义:
x:x坐标
y:y坐标
0:B通道 1:G通道 2:R通道
首先加载一张彩色图片
import cv2 import numpy as np img = cv2.imread('4.jpg')
访问像素
px = img[y,x] print(px) # 输出值是 x,y 处,蓝b,绿g,红r 的数组 [100,200,190]
px = img[y,x,0] print(px) # 指定输出x,y处 ,0(B)通道的像素值 结果等于 157
修改像素
img[y, x] = [255, 255, 255] # 修改(x,y)处3个通道的像素值为 [255,255,255]
方法二:通过numpy优化库
Numpy是一个优化的库,能够快速计算数组。所以如果一个个访问每个像素并修改它的值是很慢的,也不推荐。一般来说都是选择数组的一片区域进行修改。
首先加载一张彩色图片
import cv2
import numpy as np
img = cv2.imread('4.jpg')
读取
print(img.item(10, 10,2))
如果想要访问BGR3个通道的值,需要分开访问,调用3次
修改
img.itemset((10, 10, 2), 100)
图片ROI(region of interest)
有时候,你会需要处理图片的特定区域。对于图片的眼部识别,首先对整个图片进行面部识别,找到脸以后,在脸的区域内找眼睛。这个方法能够提高准确度(因为眼睛总是在脸上的)性能上也好(因为我们找的区域更小)
截取图片
import cv2 as cv import numpy as np img = cv.imread('4.jpg') ball = img[280:340, 330:390] #img[y1:x1,y2:x2] y1:x1 对角线左上点的值 y2:x2 对角线右下点的值 img[100:160, 150:210] = ball #img[y1:x1,y2:x2]
cv.imshow("image",img) cv.waitKey(0)
图像通道的分割和合并
有时候可能需要将图片的3个通道分割出来,有时候会需要将一个通道合并到其它通道。
拆分通道
方法1:
b,g,r = cv.split(img)
参数:
img:待拆分图像
方法2:
b = img[:,:,0] #只获取图像的一个通道
注意:假设你想把所有的红色像素变成0,你不用这么分割,你可以简单的使用Numpy索引,这样更快。img[:,:,2]=0
警告:cv2.split()是一个成本很高的操作(执行时间),所以只在必要的时候使用。Numpy索引要更有效率,能用就用。
合并通道
dst=cv.merge(mv[, dst])
参数:
img = cv.merge((b,g,r))