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.hqwc.cn/news/129509.html

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

相关文章

排序算法——直接插入排序

一、介绍 插入排序就是将前两个元素排好,再将第三个元素通过与前边的元素比较后插入适当的位置,再将第四个元素插入,不断重复插入与前边元素比较的操作,直到将元素都排列好。 演示如下: 视频演示:…

GB28181学习(六)——实时视音频点播(数据传输部分)

GB28181系列文章: 总述:https://blog.csdn.net/www_dong/article/details/132515446 注册与注销:https://blog.csdn.net/www_dong/article/details/132654525 心跳保活:https://blog.csdn.net/www_dong/article/details/132796…

千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)

文章目录 前言心得体会一、 UDP 协议简单回顾二、UDP接收实现三、完整代码展示四、仿真测试(1)模拟电脑数据发送,(2)测试顶层文件编写(3)仿真文件(4)仿真波形前言 在前面我们对以太网 UDP 帧格式做了讲解,UDP 帧格式包括前导码+帧界定符、以太网头部数据、IP 头部数…

断点测试怎么做,一文教你用Charles 工具做好接口测试!

在测试工作过程中,我们经常会在程序的某一行或者某一环节设置断点,在程序请求的过程中,修改断点处的参数、请求或者响应,这就是所谓的断点测试。这类断点测试主要用于接口测试。 断点测试可以通过查看接口返回数据可以方便定位是前…

大数据—数据透析表常见使用(手把手详解)

我的个人主页:☆光之梦☆_C语言基础语法(超详细),【java入门】语法总结-CSDN博客 创作不易,如果能帮到你就好 注:你的 👍点赞 ⭐收藏 📝评论 是对博主最大的支持与鼓励喔 目录 一、创建数据透…

Stable Diffusion云服务器部署完整版教程

Stable Diffusion云服务器部署完整版教程 2023年07月04日 22:30 3607浏览 18喜欢 22评论 <span class"bili-avatar-icon bili-avatar-right-icon "></span> </div>薯片_AI 粉丝&#xff1a; 1513 文章&#xff1a; 1 设置分组取消关注 已关注 …

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)

目录 前言 运行结果&#xff1a; 运行截屏&#xff08;p50e&#xff09; apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法&#xff1a; blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…

基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基于AlexNet深度学习网络的智能垃圾分类系统概述 4.2、基于AlexNet深度学习网络的智能垃圾分类系统主要原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab20…

Axure RP 9 for Mac(原型设计软件)中文正式版

Axure RP 9 是一款流行的原型设计和线框图软件&#xff0c;允许设计人员和开发人员为网站和移动应用程序创建交互式动态原型。它提供了一整套用于创建交互式设计的工具和功能&#xff0c;包括拖放小部件、条件逻辑、动态内容和动画。 软件下载&#xff1a;Axure RP 9 for Mac中…

三十三、【进阶】索引的分类

1、索引的分类 &#xff08;1&#xff09;总分类 主键索引、唯一索引、常规索引、全文索引 &#xff08;2&#xff09;InnoDB存储引擎中的索引分类 2、 索引的选取规则(InnoDB存储引擎) 如果存在主键&#xff0c;主键索引就是聚集索引&#xff1b; 如果不存在主键&#xff…

架构师选择题--信息安全技术(系统安全)

架构师选择题--信息安全技术 真题 很少超纲 真题 b c d d b a d a d a Kergberos和数字证书是类似的协议 向TGS申请票据 C PGP&#xff1a;安全电子邮件传输协议 b c b 使用发送方是私钥加密摘要–发送方不可抵赖 加密&#xff1a;保密性 信息摘要&#xff1a;完整性 数…

如何应对数据安全四大挑战?亚马逊云科技打出“组合拳”

数字经济时代&#xff0c;数据被公认为继土地、劳动力、资本、 技术之后的又一重要生产要素。对于企业而言&#xff0c;数据则是一切创新与关键决策的根源。 然而&#xff0c;企业在发挥数据资产的商业价值方面&#xff0c;却面临诸多挑战&#xff0c;比如敏感数据识别、跨组织…