常见的色彩空间有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()
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()
像素是组成图像的小方格,单位面积像素越多分辨率越高。像素的实际大小为 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()
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()
【参考】DataWhale OpenCV课程