使用OpenCV实现图像覆盖

颜色通道说明

每张图像都包括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读取图像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hV9kMluN-1604126395558)(en-resource://database/911:1)]

打印图片可以得到一系列类矩阵数据:

[[[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

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hong_Youth

您的鼓励将是我创作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值