1 图像色彩空间转换
常见的色彩空间有HSV、RGB和YCrCb三种:
RGB的色彩空间是设备独立的,不受设备不同的影响,取值范围在0-255。HSV色彩空间对计算机友好,H取值0-180,SV取值0-255。YCrCb色彩空间,Y表示信息,CrCb可以被压缩。
图像从一个色彩空间之间可以变换,但是可能存在如下问题:
- 是否可以从一个色彩空间转换到另一个色彩空间
- 是否存在信息传递和损失
- 这一过程是否可逆
OpenCV中色彩空间变换的函数为cv.cvtColor(src,code[, dst[, dstCn]]) -> dst
,其中src
为输入图像,类型可以为uint8
或float32
。code的表示类型有cv::COLOR_BGR2RGB=4
、cv::COLOR_BGR2GRAY=6
、cv::COLOR_GRAY2BGR=8
、cv::COLOR_BGR2HSV=40
演示示例:
image = cv.imread("lena.jpg")
cv.imshow("lena", image)
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
cv.imshow("HSV", hsv)
cv.imshow("ycrcb", ycrcb)
cv.waitKey(0)
cv.destroyAllWindows()
2 图像对象的创建与赋值
opencv中图像对象是一个ndarray,支持的数据类型:np.uint8
、np.float32
、np.int32
、np.int64
。创建图像对象即创建一个numpy数组,np.zeros
可以创建一个全黑图像,np.ones
可以创建一个像素值全为1的图像,对于RBG图像,数值范围在0-255。
演示示例:
m1 = np.ones((256, 256, 3))
cv.imshow("m1", m1)
m2 = np.ones((256, 256, 3))
m2[:128] = (255, 0, 0)
cv.imshow("m2", m2)
cv.waitKey(0)
cv.destroyAllWindows()
3 图像像素的读写操作
像素是组成图像的小方格,单位面积像素越多分辨率越高。像素的实际大小为
d
p
i
×
i
n
c
h
e
s
=
像素总数
dpi\times inches=像素总数
dpi×inches=像素总数。
灰度图像像素值排序:
彩色图像像素值排序:
像素值的读取方式为b, g, r = image[row, col]
,像素写方式为image[row, col] = (255, 0, 0)
演示示例:
image = cv.imread("lena.jpg")
cv.imshow("lena", image)
h, w, c = image.shape
for row in range(h):
for col in range(w):
b, g, r = image[row, col]
image[row, col] = (255-b, 255-g, 255-r)
cv.imshow("visited", image)
cv.waitKey(0)
cv.destroyAllWindows()
4 图像算术运算
OpenCV支持四种图像的算术操作
- 加:
cv.add(src1, src2[, dst[, mask[, dtype]]]) -> dst
- 减:
cv.subtract(src1, src2[, dst[, mask[, dtype]]]) -> dst
- 乘:
cv.multiply(src1, src2[, dst[, scale[, dtype]]]) -> dst
- 除:
cv.divide(src1, src2[, dst[, scale[, dtype]]]) -> dst
加法函数可以保证图像不越界,即数值在0-255,使用saturate
mask
可以使得加减法只在mask的非零区域进行。
演示示例:
image = cv.imread("lena.jpg")
cv.imshow("lena", image)
m1 = np.zeros_like(image)
m1[:128] = (255, 0, 0)
cv.imshow("m1", m1)
sub1 = cv.add(image, m1)
cv.imshow("add", sub1)
cv.waitKey(0)
cv.destroyAllWindows()
5 图像的复制
可以通过img.copy()
赋值原有图像,例如
img = cv.imread("lena.jpg")
copyImg = img.copy()
6 图像的保存
热TV阿里= cv.imwrite(filename,img,[,params])
filename
是要存储文件的路径img
是要保存的图像矩阵params
表示特定保存格式的参数编码,默认为空。