每张图像都包括RGB三个通道,分别代表红色、绿色和蓝色,使用它们来定义图像中任意一点的像素值,红绿蓝的值在0-255之间。

例如:一个像素值[255,0,0]代表全部为红色,像素值[255,255,0]是红色和绿色的混合,将显示为黄色。

但是,如果使用OpenCV读取图像,它将以BGR格式生成图像,那么[255,0,0]将代表蓝色。

使用OpenCV读取一张图像

任何图像都可以通过OpenCV使用cv2.imread()命令读取。不过,OpenCV不支持HEIC格式的图像,所以不得不使用其它类型的库,如Pillow来读取HEIC类型的图像(或者先将它们转换为JPEG格式)

import 

当读取图像之后,如果有必要的话可以将其从BGR格式转换为RGB格式,通过使用cv2.cvtColor()命令实现。

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

覆盖

图像可以看作是是一堆像素值以类似矩阵的格式存储。任何像素的值都可以独立于其他像素进行更改。这里有一张图像,使用OpenCV读取图像:

image_1
image_1 = cv2.imread(‘image_1.jpg’)
print(image_1)

这里将给出矩阵形式的一系列像素值

array([[[107, 108, 106],[107, 108, 106],[107, 108, 106],…,[ 77, 78, 76],[ 77, 78, 76],[ 76, 77, 75]],…,[[ 93, 88, 87],[ 93, 88, 87],[ 92, 87, 86],…,[ 52, 62, 62],[ 52, 62, 62],[ 52, 62, 62]]], dtype=uint8)

如果只改变图像某一区域的像素值,比如更改为[0,0,0],这部分区域将变成黑色,因为这是颜色为黑色的像素值。同样,如果将像素值更改为[255,0,0],则该区域将变为蓝色(OpenCV以BGR格式读取图像)。

image_1[50: 100, 50:100] = [255, 0, 0]

同样,这些像素值可以被另一幅图像替换,只需通过使用该图像的像素值。为了做到这一点,我们需要将覆盖图像修改为要替换的像素值的大小。可以通过使用cv2.resize()函数来实现

image_2 = cv2.imread(‘image_2.jpg’)
resized_image_2 = cv2.resize(image_2, dsize=(100, 100))

其中,dsize 代表图像要被修改的尺寸。

现在,可以将第二张图像够覆盖在第一张图片的上面

image_1[50:150, 50:150] = resized_image_2

覆盖PNG图像

与JPEG图像不同,PNG图像有第四个通道,它定义了给定像素的ALPHA(不透明度)。除非另有规定,否则OpenCV以与JPEG图像相同的方式读取PNG图像。为了读取带有Alpha值的PNG图像,我们需要在读取一张图像时指定标志cv2.IMREAD_UNCHANGED。现在,这个图像已经有了四个通道:BGRA

image_3 = cv2.imread(‘image_3.png’, cv2.IMREAD_UNCHANGED)
print(image_3)
array([[[0 0 0 0][0 0 0 0][0 0 0 0]…[0 0 0 0][0 0 0 0][0 0 0 0]]…[[0 0 0 0][0 0 0 0][0 0 0 0]…[0 0 0 0][0 0 0 0][0 0 0 0]]], dtype=uint8)

然而,这个图像有4个通道,但是我们的JPEG图像只有3个通道,所以这些值不能简单地替换。我们需要在我们的JPEG图像中添加一个虚拟通道。为此,我们将使用numpy。可以使用pip install numpy命令安装它。

numpy提供了一个函数numpy.dstack()来根据深度叠加值。

首先,我们需要一个与图像大小相同的虚拟数组。为了创建虚拟通道,我们可以使用numpy.ones()函数创建一个数组。

import numpy as npones = np.ones((image_1.shape[0], image_1.shape[1]))*255
image_1 = np.dstack([image_1, ones])

我们将其数组与255相乘,因为alpha通道的值也存在于0-255之间。现在,我们可以用PNG图像替换图像的像素值。

image_1[150:250, 150:250] = image_3

然而,它不会给出期望的结果,因为我们将alpha通道的值改为了零。

我们只需要替换那些具有非零值的像素值。为了做到这一点,我们可以通过检查每个像素值和替换非零值来强行执行,但这很耗时。

这里有一个更好的方法。我们可以获取要覆盖图像的alpha值。

alpha_image_3 = image_3[:, :, 3] / 255.0

我们将像素值除以255.0,以保持值在0-1之间。

image_1和image_3的alpha之和需要等于255。因此,我们可以创建另一个数组,其中包含和等于255的所需alpha值。

alpha_image = 1 — alpha_image_3

现在,我们可以简单的取每个图像的alpha值和每个通道的图像像素值的元素乘积,并取它们的和。

for c in range(0, 3): image_1[150:250, 150:250, c] = ((alpha_image*image_1[150:250,      150:250, c]) + (alpha_image_3*image_3[:, :, c]))

现在,我们可以简单的取每个图像的alpha值和每个通道的图像像素值的元素乘积,并取它们的和。

for c in range(0, 3): image_1[150:250, 150:250, c] = ((alpha_image*image_1[150:250,      150:250, c]) + (alpha_image_3*image_3[:, :, c]))

交流群

欢迎加入“小白学视觉”公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

https://u.wechat.com/MH0UMFnCLWaNZIyd9ga2W-8 (二维码自动识别)

c++ opencv实现区域填充_使用OpenCV实现图像覆盖相关推荐

  1. c++ opencv实现区域填充_利用opencv之为图像添加边框

    我们经常会有对图像边缘做扩展的需求.比如 希望卷积后得到的矩阵大小不变 希望改变图像大小,但是不改变宽高比 opencv实现 opencv中使用copyMakeBorder()来完成这一功能 api ...

  2. opencv 检测几何图形_使用OpenCV + ConvNets检测几何形状

    opencv 检测几何图形 A simple yet powerful pipeline for detecting shapes in scanned documents 一个简单而强大的管道,用于 ...

  3. opencv物品定位_使用OpenCV获取零件位置的学习笔记

    最近公司接到一个案子,使用移动机械臂抓取圆盘上下料,目前我们的移动机器人定位精度在两厘米左右,因此需要视觉辅助定位来提高夹取的精度. 这个项目本身不是我做,出于对是视觉的兴趣,学习了一下如何使用Ope ...

  4. c++ opencv实现区域填充_帮你解锁一个新技能,opencv完美媲美PS,图片PS,我们代码实现...

    很多时候,我们相中了一张图片,怎奈图片上面有水印,不会PS的我们该如何来处理图片,这里小编介绍一下一下opencv的cv2.inpaint的图片修复函数,使用此cv2.inpaint函数,可以完美匹配 ...

  5. opencv 边缘平滑_基于OpenCV的车道检测实现(一)

    无人驾驶的话题日趋起热,而车道线检测对于无人驾驶的路径规划来讲特别重要.要遵守交通规则,首先的要求便是对车道线检测,而且通过检测车道线可以进一步的检测地面指示标志.进行前碰撞预警策略设计等. 早早就对 ...

  6. opencv 阈值分割_用 OpenCV 去除图片中的水印,骚操作!

    点击上方 小张Python,加为星标 第一时间收到 Python 技术干货! 参考连接:https://stackoverflow.com/questions/32125281/removing-wa ...

  7. python opencv 相机标定_使用OpenCV校准鱼眼镜头的方法

    01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇 ...

  8. java opencv bp网_基于Opencv自带BP网络的车标简易识别

    记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和测试集准备 先将数据集手动划分成训练集和测试集,并分好类,比如第一类就放在文件夹名为0的文件夹下, ...

  9. opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)

    上期文章我们分享了opencv识别图片中的人脸,OpenCV图片人脸检测,本期我们分享一下如何从视频中检测到人脸 视频人脸检测 OpenCV打开摄像头特别简单,只需要如下一句代码 capture = ...

最新文章

  1. “物联网+云平台”的实验室管理方案,瞄准的是生物医药和化工行业
  2. UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 4..... 针对调用文件出现该错误时的解决办法
  3. android Json处理换行符
  4. js将中文转换成编码 java解析_JS实现的汉字与Unicode码相互转化功能分析
  5. python日记(四)字典的常见用法
  6. 图像目标检测(Object Detection)原理与实现(一)
  7. 206.12.15随笔--最近内心的一些想法
  8. 设计模式(四)行为型模式
  9. 计算几何——poj1410,线段不规范交
  10. 软件测试记录包括哪些,bug记录里通常包括哪些内容?
  11. 计算机与现代社会英语作文,高一英语作文,科技以下是题目:众所周知,科技在现代社会和生活中扮演着越来越重要的角色,但科技同时也是一把双刃剑,在它璀璨...
  12. 一分钟读懂dB、dBm、dBw的区别
  13. spline曲线使用
  14. Meltdown(熔断漏洞)- Reading Kernel Memory from User Space/KASLR | 原文+中文翻译
  15. git中误提交了不想提交的文件,想要从版本库中删除的方法
  16. 第五章创业机会与创业风险
  17. 采用最新闪存驱动技术 戴尔再次大幅降低企业级闪存存储成本
  18. 前端处理后端返回的excel文件流并下载
  19. 【摄影】如何利用手机拍摄好的摄影作品
  20. 真正理解微软Windows程序运行机制——窗口机制(第一部分)

热门文章

  1. C#: IntelliSense 貌似做错了一些事情。
  2. Selenium Web 自动化 - 如何找到元素
  3. 19.Oracle10g服务器管理恢复--RMAN表空间恢复(练习33)
  4. ActiviteX 服务
  5. 十招轻松搞定社会媒体
  6. Mysql与sqlite注意
  7. 揭开Socket编程的面纱
  8. 【9915】乘积最大
  9. AC自动机 HDU 2222
  10. EC笔记:第4部分:19、设计class犹如设计type