颜色通道说明
每张图像都包括RGB三个通道,分别代表红色、绿色和蓝色,使用它们来定义图像中任意一点的像素值,红绿蓝的值在0-255之间。
例如:一个像素值[255,0,0]代表全部为红色,像素值[255, 255,0]是红色和绿色的混合,将显示为黄色。
但是,如果使用OpenCV读取图像,它将以BGR格式生成图像,那么[255,0,0]将代表蓝色。
使用OpenCV读取一张图像
任何图像都可以通过OpenCV使用cv2.imread()命令读取。不过,OpenCV不支持HEIC格式的图像,所以不得不使用其它类型的库,如Pillow来读取HEIC类型的图像(或者先将它们转换为JPEG格式)
img = cv.imread('image.png')
当读取图像之后,如果有必要的话可以将其从BGR格式转换为RGB格式,通过使用cv2.cvtColor()命令实现。
# 图片转换为RGB模式
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 图片转换为灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
覆盖
图像可以看作是是一堆像素值以类似矩阵的格式存储。任何像素的值都可以独立于其他像素进行更改。这里有一张图像,使用OpenCV读取图像:
打印图片可以得到一系列类矩阵数据:
[[[107 108 105]
[107 108 105]
[107 108 105]
...
[ 77 78 75]
[ 77 78 75]
[255 255 255]]
[[107 108 104]
[107 108 104]
[107 108 104]
...
[ 77 78 75]
[ 77 78 75]
[255 255 255]]
[[107 108 104]
[107 108 104]
[107 108 104]
...
[ 77 78 75]
[ 77 78 75]
[255 255 255]]
...
[[ 91 89 86]
[ 91 89 86]
[ 91 89 86]
...
[ 49 62 63]
[ 49 62 63]
[255 255 255]]
[[ 90 88 85]
[ 90 88 85]
[ 90 88 85]
...
[ 49 62 63]
[ 49 62 63]
[255 255 255]]
[[ 90 88 85]
[ 90 88 85]
[ 90 88 85]
...
[ 49 62 63]
[ 49 62 63]
[255 255 255]]]
如果只改变图像某一区域的像素值,比如更改为[0,0,0],这部分区域将变成黑色,因为这是颜色为黑色的像素值。同样,如果将像素值更改为[255,0,0],则该区域将变为蓝色(OpenCV以BGR格式读取图像)。
img[50:100, 50:100] = [255, 0, 0]
得到如下效果:
同样,这些像素值可以被另一幅图像替换,只需通过使用该图像的像素值。
为了做到这一点,我们需要将覆盖图像修改为要替换的像素值的大小。可以通过使用cv2.resize()函数来实现。
img1 = cv.imread('image1.png')
resize_img1 = cv.resize(img1, dsize=(50, 50)) # dsize表示需要修改的尺寸
img[50:100, 50:100] = resize_img1
经过将图片换进缺失像素的图片中可以得到最后图片覆盖的效果:
上面是针对两幅图片的通道数是相同的情况下的图片覆盖结果。
针对通道数不同的覆盖需要将他们的通道数变为相同才行。
参考文献:https://github.com/YouthJourney/Computer-Vision-OpenCV/tree/master/picture_overlay