OpenCV 第二次小作业

这篇博客介绍了如何使用OpenCV进行图像处理,包括读取图像信息、创建滑动条、实现图像混合过渡以及在图像上圈出目标(足球)。通过滑动条动态调整两张图片的混合权重,实现平滑过渡效果。同时,详细阐述了如何将一个图像(如OpenCV_LOGO)精确地放置到另一张图像(足球照)上,涉及图像抠图、灰度转换、二值化、像素操作等步骤。最后,展示了在足球区域内用红色矩形标注目标的实现过程。
摘要由CSDN通过智能技术生成

本次作业内容:
输出图片的信息,(行 列 通道等),使用滑动条完成两张图片的图像混合过渡,并在图中用红色矩形圈出足球目标(改变像素值)
分四步走

1. 输出图片的信息

使用img.shape方法即可
代码如下所示

# 初始化一些信息
img1_path = './img/sc.jpeg'
img2_path = './img/openCV_LOGO.jpg'
...
...
...
# img1_SIZE = 1680 * 1050
# img2_SIZE = 435 * 384
img1_Size = (1680, 1050)  # 设置图像大小
img2_Size = (435, 384)  # 设置图像大小

img1 = cv2.imread(img1_path)
img2 = cv2.imread(img2_path)
img3 = img1.copy()
img_original = cv2.imread(img1_path)

print("img1图像信息:", end='')
print(img1.shape)
print("img2图像信息:", end='')
print(img2.shape)
print("img3图像信息:", end='')
print(img3.shape)

2. 制作一个滑动条

使用cv2.createTrackbar(trackbarName, windowName, value, count, onChange)方法即可
代码如下:

MyTrackBarName = 'Blending Weight'
window_Name = 'image'
...
...
...
# 创建滑动条
cv2.createTrackbar(MyTrackBarName, window_Name, 0, 100, nothing)  # 设置滑动条来完成两张图片的混合过渡

像这样:
在这里插入图片描述

3. 完成两张图片的图像混合过渡

这里就需要将图片抠出来,然后放置到足球图片上去
结果像这样:

在这里插入图片描述
是这两张图片
在这里插入图片描述

在这里插入图片描述

这不就是抠图嘛~
OpenCV中可以对图像进行按位运算,在OpenCV中,黑色,也就是(0)相当于透明,可以被任何其他的东西替换,学过ps的同学应该知道,图像如果低是透明的,就可以很轻松的与其他的图片叠加在一起,谁在上谁在下,要调整的不过就是图层而已。
跑题了,在OpenCV中抠上面的logo图我们可以分成以下步骤:

  1. 将背景图的指定区域(你要放置的地方)这里的区域要与OpenCV的logo图片大小(像素值)一致
  2. 我们需要先将OpenCV的logo转换成灰度图,好进行下一步处理
  3. 将灰度图二值化,也就是非黑及白。(制作蒙版)
  4. 再将其黑白颠倒,同时将彩色的logo放到蒙版上去
  5. 将这个扣好的图片放到背景图上去。
  6. 我们一步步来
    在这里插入图片描述

  1. 将背景图的指定区域(你要放置的地方)复制出来
    注:这里的区域要与OpenCV的logo图片大小(像素值)一致
    代码如下:
roi = img1[0:rows, 0:columns]  # 截取img1(足球照)中左上角与img2相同大小的图片,赋值给roi
  1. 我们需要先将OpenCV的logo转换成灰度图,好进行下一步处理
    代码如下:
img2_Gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 将logo转换为灰度图
  1. 将灰度图二值化,也就是非黑及白。(制作蒙版)
ret, mask = cv2.threshold(img2_Gray, 200, 255, cv2.THRESH_BINARY)  # 将灰度图二值化,以制作MASK
# bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
# bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
# bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
# bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1
  1. 再将其黑白颠倒,同时将彩色的logo放到蒙版上去
mask_inv = cv2.bitwise_not(mask)  # 进行二进制"非"操作,将mask颜色反转,以确保我们要的图形不是黑色(0),不要的图形都是黑色(0)
#                                   方便进行下一步“与”操作。
  1. 将这个扣好的图片放到背景图上去。
img1_BG = cv2.bitwise_and(roi, roi, mask=mask)  # roi 和 mask进行 “与” 操作,取 roi 中与 mask 中不为 0(黑色)的值对应的像素的值,
#                                               其他值为 0 ,放入img_BG中。
#                                               注意这里必须有 mask = mask 或者 mask = mask_inv, 其中的 mask = 不能忽略
#                                               这里取出来一个黑色的遮罩(0),方便后面将我们要扣的图像放入遮罩中
img2_FG = cv2.bitwise_and(img2, img2, mask=mask_inv)  # 将 “OPENCV_LOGO” 的原图放入遮罩中,剔除掉遮罩外的内容,遮罩外为黑色(0)
#                                                         这样提取出来的图像就是彩色的原图,如果进行抗锯齿等处理就更完美了。
dst = cv2.add(img1_BG, img2_FG)  # 将扣好的图片与裁切好的足球照片(img1)放在一起,准备放入足球照片中去。
  1. 放进足球照片(img1)中去,完成抠图。
img3[0:rows, 0:columns] = dst  # 放进足球照片(img1)中去,完成抠图。

4. 在图中用红色矩形圈出足球目标(改变像素值)

这里还没有做到智能获取,是手动获取的像素点。
代码如下:

football = img_original[897:1044, 1270:1400]  # 先复制一下足球区域的各个像素
#                                                     这里注意!!! 不知道为什么,这个变量并没有存储这些像素值,而是仅仅标记了一下
#                                                     所以需要先复制一份原始图像,标记原始图像,然后再粘贴上去。
img3[887:1054, 1260:1410] = (0, 0, 255)  # 将足球区域变成红色
img3[897:1044, 1270:1400] = football  # 将足球粘贴回去

5. 收尾,完成使用滑动条从透明到不透明显示

代码如下:

...
...
...
def img_blending(wdName, trackBarName, image1, image2, ):
    weight_x: float = (100 - cv2.getTrackbarPos(trackBarName, wdName)) / 100  # 动态获取滑动条的值并转换成小数
    weight_y: float = 1 - weight_x  # 另一个权值为 1 - weight_x
    return cv2.addWeighted(image1, weight_x, image2, weight_y, 0)  # 返回对象

while 1:
    cv2.imshow(window_Name, img_blending(window_Name, MyTrackBarName, img_original, img3))  # 显示主窗口
    k = cv2.waitKey(1) & 0xFF  # 按 “ESC” 退出
    if k == 27:
        break
cv2.destroyAllWindows()

最终效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本次作业到这里就完成了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值