【像素访问】
所有的操作与 NumPy
相关。熟悉 NumPy
会写出更好的代码。
import numpy as np
import cv2
img = cv2.imread('messi5.jpg')
# 获取 y = 80, x = 180 位置处的像素值
px = img[80, 180]
print(px) # 77, 84, 180
# 设置 y = 80, x = 180 位置处的像素为白色
img[80, 180] = [255, 255, 255]
# 获取 y = 80, x = 200 位置处蓝色通道的值,通道顺序为 B(blue), G(green), R(red)
bluepx = img[80, 200, 0]
print(bluepx) # 96
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
NumPy 是一个快速数组运算的优化库,简单的像素访问和修改可能会比较慢,所以是不推荐的。取几行或者取几列会很快,但是对于单个像素的访问,NumPy有 array.item()和array.itemset()会更好,它们总是会返回一个标量,但是如果想要访问所有的BGR的值,需要分别使用 array.item() 获得每个值。
# Better pixel accessing and editing method :
# 修改 y = 80, x = 160 位置处红色通道像素值为255
img.itemset((80, 160, 2), 255)
# 访问 y = 80, x = 160 位置处的各像素值
b = img.item(80, 160, 0)
g = img.item(80, 160, 1)
r = img.item(80, 160, 2)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
【图像属性】
import numpy as np
import cv2
img = cv2.imread('messi5.jpg')
print( img.shape )
print( img.size )
print( img.dtype )
【ROI】
import numpy as np
import cv2
img = cv2.imread('messi5.jpg')
# 通过 NumPy 的方式取得球位置的图像
# 并将取出来的ROI图像复制到图像其他位置
# cropped = img[start_row:end_row, start_col:end_col]
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
【通道】
import numpy as np
import cv2
img = cv2.imread('messi5.jpg')
# 将图像的通道分离为 BGR 通道
b,g,r = cv2.split(img)
# 合并通道
img = cv2.merge((b,g,r))
# numpy的索引方式更快
img[:,:,2] = 0
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
NOTE: cv2.split
是一个耗时的函数,只有在必须使用的时候才去用它,否则用 NumPy
的通道索引更好一些。
【扩边】
void cv::copyMakeBorder ( InputArray src,
OutputArray dst,
int top,
int bottom,
int left,
int right,
int borderType,
const Scalar & value = Scalar()
);
参数
src: 源图像
dst: 目标图像,类型与源图像相同,尺寸大小为(src.cols+left+right, src.rows+top+bottom)
top: 顶部像素数
bottom: 底部像素数
left: 左边像素数
right: 右边像素数
borderType: 扩边类型
value: 如果扩边类型为常数,则设置
Lnton 羚通专注于音视频算法、算力、云平台的高科技人工智能,基于视频分析技术、视频智能传输技术、远程监测技术以及智能语音融合技术等, 拥有多款可支持 ONVIF、RTSP、GB/T28181 等多协议、多路数的音视频智能分析服务器。