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

news2024/11/16 15:41:15

目录

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:
        break
    if 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 math

def hacker(img):
    height, width, channels = img.shape
    for 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 np

if __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 = 101
    y_step = 10
    for i in range(-1, 4):
        # TODO(You): 请在此实现代码
        x_offset = x_step*i
        y_offset = y_step*i
        img[start[0]-y_offset:start[1]-y_offset, end[0]+x_offset:end[1]+x_offset] = ball
    cv2.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.coloradmin.cn/o/1063590.html

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

相关文章

netcore MediatR

一、安装包 <PackageReference Include"MediatR" Version"12.1.1" /> 二、编写示例 using MediatR;namespace WebApplication7 {public class TestCommand : IRequest<bool>{}public class TestCommandHandler : IRequestHandler<TestCo…

Python为Excel中每一个单元格计算其在多个文件中的平均值

本文介绍基于Python语言&#xff0c;对大量不同的Excel文件加以跨文件、逐单元格平均值计算的方法。 首先&#xff0c;我们来明确一下本文的具体需求。现有一个文件夹&#xff0c;其中有如下所示的大量Excel文件&#xff0c;我们这里就以.csv文件为例来介绍。其中&#xff0c;每…

Linux友人帐之账号用户管理

一、账号管理 1.1简介 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#…

不死马的利用与克制(基于条件竞争)及变种不死马

不死马即内存马&#xff0c;它会写进进程里&#xff0c;并且无限地在指定目录中生成木马文件 这里以PHP不死马为例 测试代码&#xff1a; <?phpignore_user_abort(true);set_time_limit(0);unlink(__FILE__);$file .test.php;$code <?php if(md5($_GET["pass…

理解自动驾驶感知技术

理解自动驾驶感知技术 文章目录 什么是自动驾驶感知技术&#xff1f;自动驾驶感知技术的关键组成部分1. 雷达&#xff08;Radar&#xff09;2. 摄像头&#xff08;Camera&#xff09;3. 激光雷达&#xff08;Lidar&#xff09;4. 超声波传感器&#xff08;Ultrasonic Sensors&a…

一文搞懂APT攻击

APT攻击 1. 基本概念2. APT的攻击阶段3. APT的典型案例参考 1. 基本概念 高级持续性威胁&#xff08;APT&#xff0c;Advanced Persistent Threat&#xff09;&#xff0c;又叫高级长期威胁&#xff0c;是一种复杂的、持续的网络攻击&#xff0c;包含高级、长期、威胁三个要素…

法国乐天下单支付流程,自养号测评技术环境揭秘。

Rakuten的前身是PriceMinister一家法国公司&#xff0c;经营电子商务网站PriceMinister&#xff0c;按访问量计算&#xff0c;该网站是法国第五大电子商务网站。2010年&#xff0c;它被乐天公司收购&#xff0c;2018年&#xff0c;它更名为Rakuten。乐天法国Rakuten France&…

蓝桥等考Python组别十四级002

第一部分&#xff1a;选择题 1、Python L14 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 d {A: 11, B: 12, C: 13, D: 14} print(d[B]) 11121314 正确答案&#xff1a;B 2、Python L14 &#xff08;15分&#x…

蓝桥等考Python组别十四级003

第一部分&#xff1a;选择题 1、Python L14 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 d {A: 1, B: 2, C: 3, D: 4} print(d[B]) 1234 正确答案&#xff1a;B 2、Python L14 &#xff08;15分&#xff09; 运…

idea多项目复合启动Compound

1、配置多项目同时启动 2、给每个项目分配最大使用内存&#xff08;非必要&#xff0c;内存大的可以不设置&#xff09;

SpringBoot自带模板引擎Thymeleaf使用详解①

目录 前言 一、SpringBoot静态资源相关目录 二、变量输出 2.1 在templates目录下创建视图index.html 2.2 创建对应的Controller 2.3 在视图展示model中的值 三、操作字符串和时间 3.1 操作字符串 3.2 操作时间 前言 Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎&am…

基于Java的企业人事管理系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

微信开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好&#xff0c;我是小悟 时间过得真快&#xff0c;转眼就到了国庆节尾巴&#xff0c;小伙伴们吃好喝好玩好了么。 关于微信开放平台第三方代小程序开发的两个事件接收推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 授权事件推送&#xff0c;事件类型以In…

面试题: Spring AOP是如何实现的? 它和AspectJ有什么区别?

Spring AOP是如何实现的? 它和AspectJ有什么区别? 背景答案SpringAOP实现与AspectJ区别AOP 的几种实现方案 个人评价 背景 想换工作, 学习一下面试题, 算是学习记录的输出. 答案 SpringAOP实现 Spring AOP 是利用的动态代理的机制, 如果一个Bean 实现了接口, 那么就会采用…

苹果签名的MDM(Mobile Device Management)?是怎么做的?优势是什么?什么场合需要应用到?

苹果签名有多少种类之TF签名(TestFlight签名&#xff09;是什么&#xff1f;优势是什么&#xff1f;什么场合需要应用到&#xff1f; 苹果签名有多少种类之TF签名(TestFlight签名&#xff09;是什么&#xff1f;优势是什么&#xff1f;什么场合需要应用到&#xff1f; MDM&am…

1400*C. Soldier and Cards(贪心模拟)

Problem - 546C - Codeforces Soldier and Cards - 洛谷 解析&#xff1a; 模拟即可&#xff0c;当循环次数过大的时候跳出循环打印 -1 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int n,x,k1,k2,cnt; queue<int>a,b;…

LangChain 摘要 和问答示例

在Azure上的OpenAI端点 注意 OpenAI key 可以用微软 用例【1. 嵌入 &#xff0c;2. 问答】 1. import os import openai from langchain.embeddings import OpenAIEmbeddings os.environ["OPENAI_API_KEY"] "****" # Azure 的密钥 os.environ["OP…

Python入门教程50:Pycharm中鼠标滚动,如何实现字体大小自由的缩放

★★★★★博文创作不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习编程小技巧。使用代码的过程中&#xff0c;如有疑问的地方&#xff0c;欢迎大家指正留言交流。喜欢的老铁可以多多点赞收藏分享置顶&#xff0c;小红牛在此表示感谢…

Http常见问题

说说 HTTP 常用的状态码及其含义&#xff1f; HTTP 状态码首先应该知道个大概的分类&#xff1a; 1XX&#xff1a;信息性状态码2XX&#xff1a;成功状态码3XX&#xff1a;重定向状态码4XX&#xff1a;客户端错误状态码5XX&#xff1a;服务端错误状态码 301&#xff1a;永久性…

Linux上将进程、线程与CPU核绑定

CPU亲和性(CPU Affinity)是某一进程(或线程)绑定到特定的CPU核(或CPU集合)&#xff0c;从而使得该进程(或线程)只能运行在绑定的CPU核(或CPU集合)上。进程(或线程)本质上并不与CPU核绑定。每次进程(或线程)被调度执行时&#xff0c;它都可以由其关联列表中的任何CPU核执行。如果…