图像数据
图像数据是多维数组,前两维表示了图像的高、宽第三维表示图像的通道个数,比如RGB,第三个维度为3,因为有三个通道;
灰度图像没有第三个维度
图像数据是由NumPy的多维数组(ndarray)表示的,因此对图像的分割和索引像操作ndarray一样操作即可
色彩空间 RGB, HSV, Gray…
图片可以有很多种表示方法,如RGB,HSV,Gray。这些的区别在于对颜色划分的侧重点不同,比如HSV用于对肤色的划分比较好,如在一张图片中找到人的手,这种情况下如果图片是用HSV表示的就比较好表示
RGB色彩空间
1.一个像素的颜色值是通过RGB三个通道混合而成的。
一个像素的颜色值为(b, g, r)
2.一个像素点的取值范围是[0,255],也可以归一化为[0.0,1.0]
一个图片就是一个三维矩阵,矩阵上每个点的取值范围是[0,255]。如下图所示一个图片有三个维度,高H,宽W和通道C,一共有三个通道RGB。
单通道灰度图
单通道灰度图只有亮度信息,取值范围是[0,255]
色彩空间的转换
cv2.cvtColor(OpenCV的方法)
cv2.cvtColor(src, code[, dst[, dstCn]]) → dst
参数:
- src: 输入的图片。
input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC… ), or single-precision floating-point. - dst:输出的图片
output image of the same size and depth as src. - code:从一个空间转成另一个颜色空间,如rgb转gray。无论是什么转什么其输入类型都是int型的。这个参数是形如cv2.COLOR_GRAY2BGR的,也就是2前面的是原来的色彩空间,2后面的是要转成的色彩空间。这里要注意的是RGB写成BGR。
color space conversion code。 - dstCn:输出图片的通道数
number of channels in the destination image; if the parameter is 0, the number of the channels is derived automatically from src and code.
RGB转Gray
输出:
输出就是最后转成成的结果dst
例子1:把灰度图转成RGB图
img_gray_data = cv2.imread('./images/messi.jpg', cv2.IMREAD_GRAYSCALE) #读入一张灰度图片
#把灰度图转成RGB图,使用参数cv2.COLOR_GRAY2BGR
img_bgr_data = cv2.cvtColor(img_gray_data, cv2.COLOR_GRAY2BGR)
cv2.imshow('gray', img_gray_data)
cv2.imshow('bgr', img_bgr_data)
cv2.waitKey(0)
cv2.destroyAllWindows()
例子2:
img_bgr_data = cv2.imread('./images/messi.jpg')
#用参数cv2.COLOR_BGR2HSV把RGB图转成HSV
img_hsv_data = cv2.cvtColor(img_bgr_data, cv2.COLOR_BGR2HSV)
cv2.imshow('bgr', img_bgr_data)
cv2.imshow('hsv', img_hsv_data)
cv2.waitKey(0)
cv2.destroyAllWindows()
把彩色图像灰度化
要想把彩色图像灰度化,就把三个通道的值分别乘一个比例(3个比例和为1),则得到的图片为灰度图
Gray=R*0.3+G*0.59+B*0.11 #比例可以自己改变
OpenCV的图像数据
图像数据是由NumPy的多维数组(ndarray)表示的。因此由opencv加载的图像数据可以调用其他常用的包进行处理和计算,如matplotlib,scipy等
换句话说矩阵可以表示成图像,例如
随机用numpy生成500*500的矩阵,然后imshow就可以看到生成的图片
import numpy as np
from matplotlib import pyplot as plt
# 随机生成500x500的多维数组
random_image = np.random.random([500, 500])
# print(random_image)
plt.imshow(random_image, cmap='gray')
plt.colorbar()
数据类型
CV中图像的像素值通常有以下两种处理范围
1. 0 - 255, 0:黑色,255:白色
2. 0 - 1, 0:黑色,1 :白色
例如,对RGB彩色图,若某一像素点R,G,B的值都为255,则合成的彩色图为白色。
这是因为当R的值为255时,代表他是红色;G为255即绿色;B为255即蓝色。红+蓝+绿=白色。
因为RGB三张图叠加起来才是一个彩色图,所以单独看每一个通道上的图时都是一个灰度图,在其灰度图上越亮代表他对应的彩色图越接近它代表的颜色。
注意: RGB在OpenCV中的顺序是BGR,不要搞错。