《Opencv》基础操作详解(2)

news2024/12/24 6:07:19

接上篇:《Opencv》基础操作详解(1)-CSDN博客

目录

Opencv基础操作

11、B、G、R颜色通道提取

12、显示单个通道颜色

13、 合并颜色通道

 14、图像添加马赛克

15、图片区域替换

16、图片的缩放(常用)

17、图像运算

(1)、+运算

(2)、add运算

(3)、图像加权运算


Opencv基础操作

11、B、G、R颜色通道提取

注意:我们这里是显示单个通道的图像,但是所显示的图片确实灰色的,那是因为只显示单个通道时, 实际上是将单个通道作为亮度值,而将其他通道设置为默认的最大值,也就是255。这会导致图像呈现为灰色。 想要展示只包含单个通道信息的彩色图像,可以将图像中的其他通道设为0。

import cv2
# 1. 读取图像
a = cv2.imread(r'./images/img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道
# g 包含绿色通道
# r 包含红色通道
cv2.imshow('result', a2)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(0)
# 5. 关闭所有窗口
cv2.destroyAllWindows()

 

12、显示单个通道颜色

import cv2
a = cv2.imread(r'./images/img.png')
# 复制原始图像以避免更改原始图像
a_new = a.copy()
a_new[:, :, 1] = 0  # 绿色通道设为0
a_new[:, :, 2] = 0  # 红色通道设为0
# 创建一个窗口来显示修改后的图像,并将其命名为'result'
cv2.imshow('result', a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

如果只将一个通道设为0,保留其他两个保留会有不同效果哦。自己尝试一下把!! 

13、 合并颜色通道

import cv2
# 1. 读取图像
a = cv2.imread(r'./images/img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道  g 包含绿色通道  r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) 或者使用这行代码
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 注意:需要将三个通道放在一个小括号中在传入cv2.merge(),且要保证三个通道数组的形状大小相同。

 14、图像添加马赛克

原理:选中图片的一部分将区域,将数组中的数值随机打乱达到马赛克效果

import numpy as np
img = cv2.imread('./images/img.png')
img[100:200,100:200] = np.random.randint(0,256,(100,100,3)) # 0,256 代表取值范围,左闭右开。()内代表数组大小
cv2.imshow('',img)
cv2.waitKey(0)

15、图片区域替换

 选中两张图片中大小相同的区域,将其中一个区域的数组赋值给另外一个图片相同的区域,就达到了图片区域替换的效果。

img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/img_1.png')
# 两边数组的大小必须相同
img1[100:200,100:200] = img2[100:200,100:200]
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)

16、图片的缩放(常用)

图片缩放cv2.resize(src,dsize,fx,fy) 用于调整图像的大小。它有以下几个参数:

src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。

dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像。

fx:沿x轴的缩放系数。

fy:沿y轴的缩放系数。

img3 = cv2.imread('./images/cat.jpg')
# 方法一
img4 = cv2.resize(img3,(400,400))
# 方法二,fx,fy代表x轴和y轴的缩放比例
img5 = cv2.resize(img3,dsize=None,fx=1.5,fy=2)
# 原图
cv2.imshow('yutu',img3)
# dsize方法缩放的图
cv2.imshow('dsize',img4)
# fx、fy方法缩放的图
cv2.imshow('exif',img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

17、图像运算

(1)、+运算

对于+号运算,当对图像a,图像b进行加法求和时,遵循以下规则:

  • 当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
  • 当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去 256 例如:相加后是260,实际是260-256= 4
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')

# +运算,超过255会减去256
img_jia = img1 + 50
cv2.imshow('yuantu',img1)
cv2.imshow('jia',img_jia)
cv2.waitKey(0)

 

不仅可以直接加数值还可以两个大小相同的区域相加

img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')
# 区域加法
img_jia2 = img1[0:200,0:200]+img2[0:200,0:200]
cv2.imshow('jia2',img_jia2)
cv2.waitKey(0)

 

(2)、add运算

对于cv2.add()运算,当对图像a,图像b进行加法求和时,遵循以下规则:

  • 当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
  • 当某位置像素相加得到的数值大于255时,该位置数值为255
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')

# 两图相加add,超过255的会以255作为数值
img1 = cv2.resize(img1,(400,400))
img2 = cv2.resize(img2,(400,400))
img_add = cv2.add(img1,img2)
cv2.imshow('add',img_add)
cv2.waitKey(0)

 

(3)、图像加权运算

cv2.addWeighted(src1, α, src2, β, γ)

就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为dst=src1×α+src2×β+γ

src1、src2:输入的图像

α、β:权重

γ:图像的亮度值(常数),将添加到加权和上

注意:在执行add操作时要保证输入的两张图大小相同

img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')

img1 = cv2.resize(img1,(400,400))
img2 = cv2.resize(img2,(400,400))
img_add_weight = cv2.addWeighted(img1,0.8,img2,0.2,0)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('weight',img_add_weight)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

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

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

相关文章

STM32——“SPI Flash”

引入 在给单片机写程序的时候,有时会用到显示屏,就拿市面上的0.96寸单色显示器来说,一张全屏的图片就占用8x1281024个字节,即1kb的空间,这对于单片机来说确实有点奢侈,于是我买了一个8Mb的SPI Flash&#x…

深入浅出:AWT的基本组件及其应用

目录 前言 1. AWT简介 2. AWT基本组件 2.1 Button:按钮 2.2 Label:标签 ​编辑 2.3 TextField:文本框 2.4 Checkbox:复选框 2.5 Choice:下拉菜单 2.6 List:列表 综合案例 注意 3. AWT事件处理 …

Flutter组件————PageView

PageView 可以创建滑动页面效果的widget&#xff0c;它允许用户通过水平或垂直滑动手势在多个子页面&#xff08;child widgets&#xff09;之间切换。每个子页面通常占据屏幕的全部空间。 参数 参数名类型描述childrenList<Widget>包含在 PageView 中的所有子部件&am…

三种电子画册制作方法

今天教大家三种电子画册的制作方法&#xff0c;很容易上手&#xff0c;需要的赶紧收藏起来 一、 利用在线平台--FLBOOK 1.注册并登录在线平台。 2.选择喜欢的模板&#xff0c;根据需求进行修改 3.批量上传PDF文件一键转换H5翻页电子画册 4.添加图片、文字等元素&#xff0c…

以太坊账户详解

文章目录 一、账户基本概念1.1 外部账户1.2 合约账户1.3 差异对比 二、帐户创建2.1 外部账户创建2.2 合约账户创建 三、账户数据结构3.1 账户状态3.2 账户状态结构 对比比特币的 “UTXO” 余额模型&#xff0c;以太坊使用“账户”余额模型。 以太坊丰富了账户内容&#xff0c;除…

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天&#xff0c;企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业&#xff0c;如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题&#xff0c;AWS 提供了一系列的文件传输服务&#xff0c;统称为 AWS Transfer 系列。这些…

基础I/O -> 如何谈文件与文件系统?

文件的基础理解 空文件也要在磁盘上占据空间。文件 文件内容文件属性。文件操作 对内容的操作 对属性的操作或者是对内容和属性的操作。标定一个文件&#xff0c;必须使用&#xff1a;文件路径 文件名&#xff08;具有唯一性&#xff09;。如果没有指明对应的文件路径&…

网络安全检测

实验目的与要求 (1) 帮助学生掌握木马和入侵的防护和检测方法、提高学习能力、应用能力和解决实际问题的能力。 (2) 要求学生掌握方法, 学会应用软件的安装和使用方法, 并能将应用结果展示出来。 实验原理与内容 入侵检测是通过对计算机网络或计算机系统中若干关键点收集信…

谷歌浏览器的资源管理功能详解

谷歌浏览器作为一款广受欢迎的网页浏览器&#xff0c;不仅以其快速、简洁和易用著称&#xff0c;还提供了强大的资源管理功能。本文将详细介绍如何在Chrome浏览器中进行资源管理&#xff0c;包括查看网页的渲染性能、禁用标签页的背景更新以及管理正在下载的文件。&#xff08;…

ARM异常处理 M33

1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类&#xff1a;预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看&#xff0c;获取更信息的异常原因&#xff1a; CFSR是由UFSR、BFSR和MMFSR组成&#xff1a; 下面列举HFSR、MMFSR、…

Unity2021.3.16f1可以正常打开,但是Unity2017.3.0f3却常常打开闪退或者Unity2017编辑器运行起来就闪退掉

遇到问题&#xff1a; 从今年开始&#xff0c;不知道咋回事&#xff0c;电脑上的Unity2017像是变了个人似得&#xff0c;突然特别爱闪退掉&#xff0c;有时候还次次闪退&#xff0c;真是让人无语&#xff0c;一直以来我都怀疑是不是电脑上安装了什么别的软件了&#xff0c;导致…

SpringBoot核心:自动配置

有使用过SSM框架的&#xff0c;还记得曾经在spring-mybatis.xml配置了多少内容吗&#xff1f;数据源、连接池、会话工厂、事务管理&#xff0c;而现在Spring Boot告诉你这些都不需要了&#xff0c;简单的几个注解统统搞定&#xff0c;是不是很方便&#xff01; 前言 SpringBoo…

重温设计模式--享元模式

文章目录 享元模式&#xff08;Flyweight Pattern&#xff09;概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式&#xff08;Flyweight Pattern&#xff09;概述 定义&#xff1a; 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…

Taro小程序开发性能优化实践

我们团队在利用Taro进行秒送频道小程序的同时&#xff0c;一直在探索性能优化的最佳实践。随着需求的不断迭代&#xff0c;项目中的性能问题难免日积月累&#xff0c;逐渐暴露出来影响用户体验。适逢双十一大促&#xff0c;我们趁着这个机会统一进行了Taro性能优化实践&#xf…

纯血鸿蒙APP实战开发——textOverflow长文本省略

介绍 本示例实现了回复评论时&#xff0c;当回复人的昵称与被回复人的昵称长度都过长时&#xff0c;使用textOverflow和maxLines()实现昵称的长文本省略展示的功能。 效果图预览 使用说明 点击评论中的"回复"&#xff0c;在输入框中输入回复内容&#xff0c;点击发…

【java面向对象编程】第九弹----抽象类、接口、内部类

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;javase &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 一、抽象类 1.1基本介绍 &…

Qt笔记:网络编程UDP

一、铺垫 1.Qt框架使用的网络结构的基础就是Linux学习的网络编程基础&#xff1b;所以使用Qt写客户端&#xff0c;使用Linux写服务端&#xff1b;两者是可以实现互联的 二、UDP 网络编程UDP使用套路&#xff1a; 1.首先在.pro文件中加上network&#xff0c;使Qt可以搭载网络…

Redis存在安全漏洞

Redis是美国Redis公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值&#xff08;Key-Value&#xff09;存储数据库&#xff0c;并提供多种语言的API。 Redis存在安全漏洞。攻击者利用该漏洞使用特制的Lua脚本触发堆栈缓冲区溢出漏洞&#xff0c;从…

【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题

目录 背包问题简介 问题描述 输入&#xff1a; 输出&#xff1a; 动态规划解法 动态规划状态转移 代码实现 代码解释 动态规划的时间复杂度 例子解析 输出&#xff1a; 总结 作者我蓝桥杯&#xff1a;2023第十四届蓝桥杯国赛C/C大学B组一等奖&#xff0c;所以请听我…

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统&#xff0c; Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 体验地址&#xff1a;http://blog.gaoredu.com/ 今天&#xff0c;我们自豪地宣布ReactPress 1.6.0版本的正式发布&#xff0c;…