1.3.OpenCV技能树--第一单元--图像的基础操作(进阶篇)

目录

1.文章内容来源

2.图像的进阶操作

  2.1.边界填充

  2.2.数值计算

  2.3.图像融合

  2.4.图像保存

  2.5.视频读取

3.课后习题代码复现

 3.1.问题一图像像素颜色

 3.2.问题二图片黑客帝国化

 3.3.问题三梅西的足球轨迹

4.易错点总结与反思


1.文章内容来源

1.题目来源:https://edu.csdn.net/skill/opencv/opencv-819f137c35c64f76945bcd7e60d37807?category=657&typeId=20811
2.资料来源:https://edu.csdn.net/skill/opencv/opencv-819f137c35c64f76945bcd7e60d37807?category=657&typeId=20810#___44

2.图像的进阶操作

   2.1.边界填充

常见的边界填充的方法有如下5种:
BORDER_REPLICATE :复制法,也就是复制最边缘像素
BORDER_REFLECT :反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcb|ajabcdefghjhg|fedcb
BORDER_REFLECT_101 :反射法,也就是以最边缘像素为轴、对称、gfedcb|jabcdefghi|gfedcba
BORDER_WRAP :外包装法 abcdefgh|abcdefgh|abcdefgh
BORDER_CONSTANT : 常量法,常数值填充,填充一个常数value(效果不好)
#%%
import cv2 
import matplotlib.pyplot as plt
img = cv2.imread(r"cv.jpg")
top_size,buttom_size,left_size,right_size = (50,50,50,50)# 定义图片显示大小# 复制法,也就是复制最边缘像素
replicate = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)# 反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcb|ajabcdefghjhg|fedcb
reflect = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)# 反射法,也就是以最边缘像素为轴、对称、gfedcb|jabcdefghi|gfedcba
reflect01 = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)# 外包装法 abcdefgh|abcdefgh|abcdefgh
wrap = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)# 常量法,常数值填充,填充一个常数value(效果不好)
constant = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT)
#绘制效果图
figure=[img,replicate,reflect,reflect01,wrap,constant]
title=[u'ORIGINAL',u'REPLICATE',u'REFLECT',u'REPLICATE01',u'WRAP',u'CONSTANT']
for i in range(6):plt.subplot(2,3,i+1)plt.imshow(figure[i],'gray')plt.title(title[i]),plt.xticks([]),plt.yticks([])
plt.show()

  2.2.数值计算

数值计算方法与原则:
图片的灰度值范围为0-255,如果超出范围就会作溢出计算。
example:如果一个灰度值为254的像素点,做加法运算+10,则表示为254+10=264>255;此时该点的像素值为264-255=9
import cv2 
img = cv2.imread(r"cv.jpg")
img2 = img + 100
img[:5,:,0]
print(img)
print("*******************************")
print(img2)

  2.3.图像融合

图像融合:1.图像融合要求我们两张图片的H和W必须是一样的。2.我们首先获取第一张图片的大小。3.我们然后用resize()函数来修改第二张图片大小与第一张图片相同。4.这里注意img.shape()返回的是(H,W),resize()需要输入的是(W,H)5.最后再用addWeighted()函数融合获得图片即可
#%%
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
img = cv.imread(r"cv.jpg")
print(img.shape)#打印出来的是(1748,2400)
img_cat = cv.imread(r"data_data.jpg")
img_cat = cv.resize(img_cat,(2400,1748))#设置与 img 一样的数值
res = cv.addWeighted(img,0.4,img_cat,0.6,0)
plt.imshow(res)
plt.xticks([]),plt.yticks([])
plt.show()

 

 2.4.图像保存

#%%
"""
图像的保存非常简单,只需要使用 imwrite() 方法即可将图像保存起来
千万注意最好别加中文
"""
import cv2 
img = cv.imread("./cv.jpg",cv.IMREAD_GRAYSCALE)# 读取图像
# 图像保存
cv.imwrite("./cv_demo.jpg",img)# 第一个参数是图像要保存的路径,第二个图像是要保存的图像

 2.5.视频读取

#%%
import cv2
video = cv2.VideoCapture(r"lihuatian.mp4")
# 检查是否打开正确
if video.isOpened():# 我们都知道视频和游戏其实都是由图像组成的,通过访问图像的帧数连贯形成的,这里也是一样# video.read() 一帧一帧地读取# open 得到的是一个布尔值,就是 True 或者 False# frame 得到当前这一帧的图像open, frame = video.read()
else:open = False#如果打开正确的话,进行每帧的遍历
while open:ret, frame = video.read()# 如果读到的帧数不为空,那么就继续读取,如果为空,就退出if frame is None:breakif ret == True:# 转换为灰度图#gray = cv2.cvtColor(frame, cv2.COLOR_UNCHANGED)cv2.imshow("video",frame)# 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快# 这里等于 27 也即是说按下 ESC 键即可退出该窗口if cv2.waitKey(10) & 0xFF == 27:break
video.release()
cv2.destroyAllWindows()

 

3.课后习题代码复现

 3.1.问题一图像像素颜色

#%%
"""
认识颜色空间,OpenCV 常用的颜色空间有RGB颜色空间、HSV颜色空间、Lab颜色空间。
以下选项中不正确打印像素(100,100)处颜色空间分量名字的是?
"""
#OPENCV中默认的颜色通道是BRG!!!
import numpy as np
import cv2 as cv
if __name__ == '__main__':img = cv.imread('lena.png', cv.IMREAD_COLOR)px = img[100, 100]print(f'blue:{px[0]}, green:{px[0]}, red:{px[0]}')

3.2.问题二图片黑客帝国化

颜色操作方法:
Method 1.数据img[i,j]上直接进行操作
Method 2.b,g,r = img.item((i, j, 0)),img.item((i, j, 1)), img.item((i, j, 2))必须分别指明bgr
#%%import numpy as np
import cv2
import mathdef hacker(img):height, width, channels = img.shapefor i in range(0, width):for j in range(0, height):b, g, r = img[i, j]hack_b = int(math.pow(b/256.0, 3/2) * 256)hack_g = int(math.pow(g/256.0, 4/5) * 256)hack_r = int(math.pow(r/256.0, 3/2) * 256)img[i, j] = (hack_b, hack_g, hack_r)if __name__ == '__main__':img_origin = cv2.imread('lena.png', cv2.IMREAD_COLOR)img = cv2.imread('lena.png', cv2.IMREAD_COLOR)print(img.size)print(img.shape)hacker(img)print('显示图片,请按任意键退出')numpy_horizontal_concat = np.concatenate((img_origin, img), axis=1)cv2.imshow('Lena图片黑客帝国化', numpy_horizontal_concat)cv2.waitKey()cv2.destroyAllWindows()

 3.3.问题三梅西的足球轨迹

   1.首先我们需要知道这个图片的轴是在哪?图片的轴是在以左上角为轴向下做y轴正方向,向右边做x轴正方向2.所以messi的球的轨迹还原是y减小x增大的路径的。3.我们描述的适合,都是习惯(x,y),但在cv很多方面都是使用(y,x)坐标。
import cv2
import numpy as npif __name__ == '__main__':img = cv2.imread('ball.jpg', cv2.IMREAD_COLOR)start = [493, 594]end = [112, 213]ball = img[start[0]:start[1], end[0]:end[1]]x_step = 101y_step = 10for i in range(-1, 4):# TODO(You): 请在此实现代码x_offset = x_step*iy_offset = y_step*iimg[start[0]-y_offset:start[1]-y_offset, end[0]+x_offset:end[1]+x_offset] = ballcv2.imshow("ball_continue", img)cv2.waitKey(0)cv2.destroyAllWindows()

4.易错点总结与反思

1.边界填充的方法有很多种,最好别用恒值填充。
2.灰度值计算具有溢出原则,超过255就又从0开始计算了。
3.图像保存用imwrite(),路径最好不要用中文。
4.OPENCV中默认的颜色通道是BGR。
5.用item()函数操作颜色的时候一定要指明是BGR。
6.图片的坐标轴是从左上方为原点,向下为y轴正半轴,向右为x轴正半轴。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之主从复制

概述: 将主库的数据 变更同步到从库,从而保证主库和从库数据一致。 它的作用是 数据备份,失败迁移,读写分离,降低单库读写压力 原理: 主服务器上面的任何修改都会保存在二进制日志( Bin-log日志…

【Zookeeper专题】Zookeeper经典应用场景实战(二)

目录 前置知识课程内容一、Zookeeper分布式锁实战1.1 什么是分布式锁1.2 基于数据库设计思路1.3 基于Zookeeper设计思路一1.4 基于Zookeeper设计思路二1.5 Curator 可重入分布式锁工作流程1.6 总结 二、基于Zookeeper实现服务的注册与发现2.1 设计思路2.2 Zookeeper实现注册中心…

GitHub相应太慢

后期使用到github下载源码,会发现响应太慢,本篇文章解决你的问题 获取域名对应的ip 访问链接:https://raw.hellogithub.com/hosts(ps:这链接定时更新),获取对应的host配置。 如果需要工具自动…

百面机器学习书刊纠错

百面机器学习书刊纠错 P243 LSTM内部结构图 2023-10-7 输入门的输出 和 candidate的输出 进行按元素乘积之后 要和 遗忘门*上一层的cell state之积进行相加。

Linux常见指令3

Linux常见指令3 一.Linux指令1.时间相关的指令1.date指定格式显示时间2.时间戳3.补充内容-日志3.Cal 2.find补充1.which2.whereis 3.uname-a-r 4.重要的几个热键5.关机命令 二.grep-i选项-n选项-v选项grep其他用途1.搜索指定进程信息2.查找日志等级 补充命令补充命令:sort补充命…

【ElasticSearch】基于Docker 部署 ElasticSearch 和 Kibana,使用 Kibana 操作索引库,以及实现对文档的增删改查

文章目录 前言一、使用 Docker 部署 ElasticSearch 和 Kibana1.1 部署 ElasticSearch1.2 部署 Kibana1.3 利用 Kibana 演示 Elasticsearch 分词效果 二、解决中文分词的问题2.1 默认分词器对中文分词的问题2.2 引入 IK 分词器2.3 IK 分词器的两种分词模式2.4 IK 分词器存在的问…

时空智友企业流程化管控系统 sessionid泄露漏洞 复现

文章目录 时空智友企业流程化管控系统 sessionid泄露漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 时空智友企业流程化管控系统 sessionid泄露漏洞 复现 0x01 前言 免责声明:请勿利用文章内的相关技术从…

Javascript笔记 rest VS spread

1 rest 2 spread 3 二者区别 在 JavaScript 中,spread 操作符 ... 和 rest 参数都使用三个点 ... 作为前缀,但它们在使用上有一些区别,主要体现在它们的作用和使用场景上。 Spread 操作符 ... 作用: "展开"数组或对象的…

无需公网IP,教学系统如何实现远程一站式管理维护?

全国多所高校应用红亚科技研发的一套教学实验系统平台,此实验系统服务器分别部署在学校内部,与校内的各种教学资源整合在一起,向校内师生提供服务。 红亚总部设立在北京,虽说在全国22个省会均设有办事处,在面对全国多…

多路彩灯控制器led流水灯VHDL速度可调仿真图视频、源代码

名称:多路彩灯控制器led流水灯VHDL速度可调 软件:Quartus 语言:VHDL 代码功能: 使用VHDL设计彩灯控制器,共24个led灯,分为5种不同的花样,可以通过按键切换花样的变化速度。 代码下载&#…

阿里云轻量应用服务器月流量限制说明(部分套餐不限流量)

阿里云轻量应用服务器部分套餐限制月流量,轻量应用服务器按照套餐售卖,有的套餐限制月流量,有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月,这两款是不限制月流量的。阿里云百科…

【虹科分享】什么是Redis数据集成(RDI)?

大量的应用程序、日益增长的用户规模、不断扩展的技术需求,以及对即时响应的持续追求。想想这些是否正是你在经历的。也许你尝试过自己构建工具来应对这些需求,但是大量的编码和集成工作使你焦头烂额。那你是否知道,有这样一个工具可以帮助你…

计算机竞赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 🔥 优质竞赛项目系列,今天要分享的是 行人车辆目标检测计数系统 …

用合成数据训练车辆姿态估计神经网络

我们的客户希望开发一款应用程序,引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中,用户被引导站在与汽车一定的角度和距离,以标准化的方式捕捉最好的照片。 当用户处于…

VR酒店虚拟仿真情景实训教学演示

在传统的酒店管理教学过程中,学生往往缺乏实践操作经验,难以将理论知识与实际工作相结合。而VR酒店虚拟仿真情景实训教学应用可以为学生提供一个逼真的、沉浸式的酒店管理环境,使学生能够在模拟实践中掌握酒店管理的各项技能。 VR酒店虚拟仿真…

pip 清华镜像

python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

dom-to-image库是如何将html转换成图片的

dom-to-image库可以帮你把dom节点转换为图片,它的核心原理很简单,就是利用svg的foreignObject标签能嵌入html的特性,然后通过img标签加载svg,最后再通过canvas绘制img实现导出,好了,本文到此结束。 另一个…

[NISACTF 2022]hardsql - quine注入

[NISACTF 2022]hardsql 一、思路分析二、解题方法 一、思路分析 题目描述:$password$_POST[passwd]; $sql"SELECT passwd FROM users WHERE usernamebilala and passwd$password;"; 从描述看出是quine注入,且用户名要是bilala 1、经测试&…

使用 TensorFlow 创建 DenseNet 121

一、说明 本篇示意DenseNet如何在tensorflow上实现,DenseNet与ResNet有类似的地方,都有层与层的“短路”方式,但两者对层的短路后处理有所不同,本文遵照原始论文的技术路线,完整复原了DenseNet的全部网络。 图1&#x…

Java @Override 注解

在代码中,你可能会看到大量的 Override 注解。 这个注解简单来说就是让编译器去读的,能够避免你在写代码的时候犯一些低级的拼写错误。 Java Override 注解用来指定方法重写(Override),只能修饰方法并且只能用于方法…