python学opencv|读取图像(五十一)使用修改图像像素点上BGR值实现图像覆盖效果

【1】引言

前序学习了图像的得加方法,包括使用add()函数直接叠加BGR值、使用bitwise()函数对BGR值进行按位计算叠加和使用addWeighted()函数实现图像加权叠加至少三种方法。文章链接包括且不限于:

python学opencv|读取图像(四十二)使用cv2.add()函数实现多图像叠加-CSDN博客

python学opencv|读取图像(四十九)使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客

python学opencv|读取图像(五十)使用addWeighted()函数实现图像加权叠加效果-CSDN博客

这些方式都是实现图片的整体叠加,如果有时候想实现局部覆盖,就需要新的方法,这就是本文的学习目标。

【2】可行性分析

实现局部覆盖,本质上是改变了图像局部像素点上的BGR值,所以从更改BGR值的角度,这个目标可行。

首先,引入一张图像,然后从另一个图像里截取部分图像的BGR值形成第三个图,再把第三个图盖到第一个图像上就可以。

【3】代码测试

按照前述可行性分析思路,先引入相关模块和初始图像:

python 复制代码
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
srcx = cv.imread('srcx.png') #读取图像srcx.png
srcp = cv.imread('srcp.png') #读取图像srcp.png
rowsx,colsx,cansx=srcx.shape #读取图像属性
rowsp,colsp,cansp=srcp.shape #读取图像属性
print('srcx的图像属性为:',srcx.shape)
print('srcp的图像属性为:',srcp.shape)

代码引入了两个图像:srcx.png和srcp.png,并且对图像的基本属性进行了读取。

之后先截取第二张图像的部分像素区域:

python 复制代码
#截取部分图像
srcp0=srcp[int(0.5*rowsp):int(0.8*rowsp),int(0.2*colsp):int(0.6*colsp),:]
rowsp0,colsp0,cansp0=srcp0.shape #读取图像属性
print('srcp0的图像属性为:',srcp0.shape)

之后用上一步截取的图像,直接覆盖到srcx.png上:

python 复制代码
#srcx的部分像素点BGR值被srcp0覆盖
srcx[int(0.5*rowsx):int(0.5*rowsx)+rowsp0,int(0.26*colsx):int(0.26*colsx)+colsp0,:]=srcp0

这里使用的是等大的像素区域,使用截取BGR值覆盖原有BGR值。

然后直接输出图像:

python 复制代码
#显示和保存图像
cv.imshow('srcx',srcx) #显示图像
cv.imwrite('srcx0.png',srcx) #保存图像
cv.imshow('srcp',srcp) #显示图像
cv.imshow('srcp0',srcp0) #显示图像
cv.imwrite('srcp0.png',srcp0) #保存图像

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行使用的图像有:

++图1 第一张图像srcx.png++

++图2 第二张图像srcp.png++

截取后的部分图像为:

++图3 截取图像srcp.png++

使用BGR覆盖后获得的叠加图像效果为:

++图4 截取图像BGR覆盖叠加图像srcx0.png++

由图4可见,截取图像BGR覆盖叠加第一张图像后获得的srcx0.png 相对于初始图像srcx.png,完全覆盖了部分区域。

此时获得的图像基本属性读取数据为:

++图5 读取图像属性值++

图5展示的图像基本属性值,给出了第一张初始图像srcx.png和第二张初始图像srcp.png的像素值,之外还给出了截取图像srcp0.png的像素值。

【4】细节说明

进行BGR值覆盖时,应注意像区域的划分:

++图6 像素区域划分++

如图6所示,像素区域划分过程中:

a.应保证像素其实点保持一致,如行的起始都是0.5*rows,列的起始都是0.25*cols,因为只有这样才能保证BGR覆盖的区域和截取的图像等大;

b.应确保像素值都是整数,不确定的时候就用int()强行转化。

此时的完整代码为:

python 复制代码
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
srcx = cv.imread('srcx.png') #读取图像srcx.png
srcp = cv.imread('srcp.png') #读取图像srcp.png
rowsx,colsx,cansx=srcx.shape #读取图像属性
rowsp,colsp,cansp=srcp.shape #读取图像属性
print('srcx的图像属性为:',srcx.shape)
print('srcp的图像属性为:',srcp.shape)

#截取部分图像
srcp0=srcp[int(0.5*rowsp):int(0.8*rowsp),int(0.2*colsp):int(0.6*colsp),:]
rowsp0,colsp0,cansp0=srcp0.shape #读取图像属性
print('srcp0的图像属性为:',srcp0.shape)

#srcx的部分像素点BGR值被srcp0覆盖
srcx[int(0.5*rowsx):int(0.5*rowsx)+rowsp0,int(0.26*colsx):int(0.26*colsx)+colsp0,:]=srcp0

#显示和保存图像
cv.imshow('srcx',srcx) #显示图像
cv.imwrite('srcx0.png',srcx) #保存图像
cv.imshow('srcp',srcp) #显示图像
cv.imshow('srcp0',srcp0) #显示图像
cv.imwrite('srcp0.png',srcp0) #保存图像

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

【5】总结

掌握了使用python+opencv使用BGR值覆盖的方式实现图像叠加效果的技巧。

相关推荐
码界筑梦坊4 分钟前
基于Flask的全国奶茶饮品加盟及门店数据分析系统的设计与实现
后端·python·flask·毕业设计
a1800793108020 分钟前
Java基础知识总结(三十二)--API--- java.lang.Runtime
java·开发语言
zzlyx9925 分钟前
2025年大年初一篇,C#调用GPU并行计算推荐
开发语言·c#
lsx20240629 分钟前
Kotlin 委托详解
开发语言
SomeB1oody31 分钟前
【Rust】18.2. 可辩驳性:模式是否会无法匹配
开发语言·后端·rust
python算法(魔法师版)41 分钟前
Spring Boot深度开发实践:从高效开发到生产级部署
开发语言·vue.js·spring boot·前端框架·ecmascript
扎量丙不要犟41 分钟前
rust跨平台调用动态库
开发语言·后端·rust
你又食言了哦1 小时前
C++实现状态模式
开发语言·c++·状态模式
小王子10241 小时前
设计模式Python版 桥接模式
python·设计模式·桥接模式
ufosuai5551 小时前
Java网络编程
java·开发语言·网络