opencv_核心操作

图像基本操作

访问和修改像素值

import numpy as np
import cv2
img = cv2.imread('c:/Users/HP/Downloads/basketball.png')
h,w,c = img.shape
#图像大小
print(h,w,c)


### 841 1494 3
# 通过行和列坐标访问像素值
img[100,100]


### 231
### array([231, 140, 146], dtype=uint8)
# 通过行和列坐标访问像素值
img[100,100]


### array([231, 140, 146], dtype=uint8)
# # 仅访问蓝色通道的像素
blue = img[100,100,0]
print(blue)


### 231
# 修改颜色
img[100,100] = [255,255,255]
print(img[100,100])


### [255 255 255]

Numpy 访问每个像素值并修改其值非常缓慢,

更好的访问和编辑像素的方法:

#访问 红色通道 的值
img.item(10,10,2)


### 131
#修改 红色通道 的值
img.itemset((10,10,2),100)
img.item(10,10,2)


### 100

访问图像属性

print(img.shape)
# 如果图像是灰度图像,则返回的元组仅包含行数和列数,因此它是检查加载的图像是灰度图还是彩色图的一种很好的方法


### (841, 1494, 3)
print(img.size)  # 总像素数


### 3769362
print(img.dtype)  # 图像数据类型


### uint8

图像中的感兴趣区域

from matplotlib import pyplot as plt

plt.imshow(img)

在这里插入图片描述

from matplotlib import pyplot as plt

ball = img[450:600,450:650]
plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(ball)

在这里插入图片描述

拆分和合并图像通道

b,g,r = cv2.split(img)  # 分割为单通道
img = cv2.merge((b,g,r))  # 合并

b = img[:,:,0]  # 或者使用numpy.array的切片方法

img[:,:,2] = 0  # 要将所有红色像素设置为零,则无需先拆分通道;Numpy 索引更快

## warning:CV.spilt()是一项代价高昂的操作(就时间而言)。所以只在你需要时再这样做,否则使用 Numpy 索引。

制作图像边界(填充)

import cv2 as CV
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img1 = img
replicate = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REPLICATE)
reflect = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REFLECT)
reflect101 = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REFLECT_101)
wrap = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_WRAP)
constant= CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

在这里插入图片描述

图像的算术运算

图像加法

# 可以通过 cv.add()或简单地通过 numpy 操作将两个图像相加,res = img1 + img2;
# 两个图像应该具有相同的深度和类型,或者第二个图像可以是像素值,比如(255,255,255),白色值。

img1 = cv2.imread('c:/Users/HP/Downloads/basketball.png')
img2 = cv2.imread('c:/Users/HP/Downloads/jump.png')
res = img1 + img2

plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(res)

在这里插入图片描述

图像混合

也是加法,但两幅图像的权重不同,就会给人一种混合或者透明的感觉。图像混合的计算公式如下:

g(x) = (1−α)f0(x) + αf1(x)

函数cv2.addWeighted()可以按下面的公式对图片进行混合操作:

dst = α⋅img1 + β⋅img2 + γ

dst = cv2.addWeighted(img1,0.7, img2,0.3, 0)

plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(dst)

在这里插入图片描述

按位操作

这包括按位 AND,OR,NOT 和 XOR 运算。它们在提取图像的某一部分(我们将在后面的章节中看到)、定义和使用非矩形 ROI 等方面非常有用。示例:

假如我想加一个OpenCV的 logo在一个图像上,如果只是简单的将两张图像想加,则会改变叠加处的颜色;

如果进行上面所说的混叠操作,则会得到一个有透明效应的结果,但我希望得到一个不透明的logo;

如果logo是一个矩形logo,那可以用上节所讲的ROI来做;

但是OpenCV的logo是不规则形状的,所以用下面的bitwise操作来进行:

#加载两张图片
img1 = cv2.imread('c:/Users/HP/Downloads/basketball.png')
img2 = cv2.imread('c:/Users/HP/Downloads/opencv_logo.png')

#我想在左上角放置一个logo,所以我创建了一个 ROI,并且这个ROI的宽和高为我想放置的logo的宽和高
rows,cols,channels = img2.shape
roi = img1 [0:rows,0:cols]

#现在创建一个logo的掩码,通过对logo图像进行阈值,并对阈值结果并创建其反转掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,mask = cv2.threshold(img2gray,10,255,cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

#现在使 ROI 中的徽标区域变黑
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(img1_bg)

#仅从徽标图像中获取徽标区域。
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

#在 ROI 中放置徽标并修改主图像
dst2 = cv2.add(img1_bg,img2_fg)
res = img1
res [0:rows,0:cols] = dst2

plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.imshow(res)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32移植Easylogger输出

简介 EasyLogger 是一款超轻量级 、高性能的 C 日志库,非常适合对资源敏感的软件项目,例如:IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C 日志库,EasyLogger 的功能更加简单,提供给用户的接口…

如何更改 Windows 默认下载位置?按照以下步骤操作

大家在使用电脑的过程中常常需要下载一些文件等资源,但是一般没有修改时电脑下载资源之后都默认存放在了 C 盘,这也导致 C 盘的空间越来越小。我们可以提前修改电脑的默认下载位置,下面一起来看一看默认下载位置怎么更改。 修改浏览器默认下…

英伟达SSD目标检测代码解析

一、官方原代码 #!/usr/bin/env python3 # # Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Softwa…

利用 AI 深度学习,实现化合物配比最优化解决方案

为什么需要化合物配比的优化? 在化合物制造行业中,化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前,这一过程高度依赖于材料专家和工程技术人员的经验,通过反复试验来验证产品性能,确保其满足市场和客户的…

Linux内核编程(一)内核模块基础

本文目录 前述:内核框架图一、Linux 内核模块概述二、Linux 模块的优点三、知识点1. GPL开源协议2. 查看已安装的模块文件:lsmod 四、常用API1. 入口函数2. 出口函数3. 声明驱动模型出/入口函数4. printk内核输出函数 五、内核源码头文件六、编写内核模块…

在ubuntu16中下载VMware Tools工具

一、打开植入 二、开始安装 打开驱动放置的默认位置 在这里打开终端;添加到/home/你的用户名/Downloand/中 进入后解压 然后进去解压后的文件 终端输入 sudo ./vmware-install.pl 开始安装前的配置(很麻烦跟着输就行) 继续 出现如上…

电脑想加个WIFI功能,怎么选!

在快速发展的物联网和智能家居时代,Wi-Fi模块作为连接各类智能设备与互联网的桥梁,其重要性不言而喻。而为了让这些模块能够适应各式各样的应用场景,不同的接口技术应运而生。今天,我们就来深入浅出地探讨几种常见的Wi-Fi模块接口,包括它们的工作原理、特点以及适用场景,…

NVIDIA Jetson AI边缘计算盒子

这里写自定义目录标题 烧录系统安装Jetpack 烧录系统 选择一台Linux系统,或者VMware的电脑作为主机,烧录系统和后面安装Jetpack都会用到。 根据供应商的指令烧录的,暂时还没验证官方烧录(后续验证补充)。 安装Jetpac…

Ant Design的创意之旅:设计师眼中的界面艺术

你知道什么是蚂蚁Ant Design?事实上,绝大多数人都不知道甚至没有听说过蚂蚁Ant Design,本文将围绕蚂蚁Ant Design是什么为大家深入分析,方便大家对蚂蚁Antt Design有清晰的认识。 1. 蚂蚁Ant Design是什么 蚂蚁Ant Design可以简…

【笔记】深度学习入门

神经网络基础 计算机视觉 1.1 人工智能的本质——线性模型 ykxb k为权重,b为偏置 像素点有323233072个任务点 所以权重有3072个,假设有10组类别,注意权重是一个矩阵 1.2 模型更新方法 权重一开始是随机的 权重和损失值,尝试…

基于STM32的智能水产养殖系统(二)

TPS5433IDR TPS5433IDR 是一款由德州仪器 (Texas Instruments) 生产的高效降压转换器(Buck Converter)。它能够将较高的输入电压转换为较低的输出电压,适用于各种电源管理应用。 主要特性 输入电压范围: 5.5V 至 36V输出电压范围: 0.9V 至 …

解决方案:昇腾aarch64服务器安装CUDA+GCC+CMake,编译安装Pytorch,华为昇腾HPC服务器深度学习环境安装全流程

目录 一、安装CUDA和cudnn1.1、下载CUDA驱动1.2、安装CUDA驱动1.3、配置环境变量1.4、安装cudnn1.5、安装magma-cuda 二、安装gcc编译器三、安装CMake四、安装NCCL五、编译安装Pytorch5.1、前提准备5.2、下载pytorch源码5.3、配置环境变量5.4、Pytorch编译安装5.5、测试Pytorch…

【Ai】使用LabelStudio做数据标注

一、什么是LabelStudio LabelStudio是一个功能丰富、灵活便捷、易于使用的数据标注工具,适用于各种机器学习和深度学习项目中的数据标注工作。有特点如下: 多功能性:LabelStudio支持为多种数据类型创建自定义标注界面,包括图像、…

python处理 yaml 时保持输入输出格式一致

问题 使用python 自带的 pyyaml库中,读取yaml文件修改 再输出后会有 打印 字段 乱序问题列表格式问题 要想保持顺序不变在 dump时添加 sort_keysFalse,使yaml格式保持原来的排序 def readyaml():with open("../data/testdata.yaml",encodi…

AI大模型火了,你的饭碗要变金饭碗还是铁饭碗?

前言 当前,AI大模型的发展正以前所未有的速度和规模推进,它们凭借其深度学习能力和海量数据训练,在诸多领域展现出了革命性的影响力。这些模型,如OpenAI的GPT系列、阿里云的通义千问等,不仅在自然语言处理上取得了显著…

惠海 H6901B升压恒流调光芯片3.7V 7.4V 12V 24V 30V 36V 48V 60V 80V 100V –光滑细腻无频闪-高端调光 太阳能照明

H6901B是一款升压型LED恒流驱动芯片,具有良好稳定性的特点。H6901B的主要特点包括宽输入电压范围(2.7V-100V)、高工作频率(1MHz)以及多种保护功能(如芯片供电欠压保护、过温保护、软启动等)。此…

Frontiers旗下期刊,23年分区表整理出炉!它还值得投吗?

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…

Ps:自动批量处理照片

有很多种方法可以将调色风格一次性应用到多张照片上。 但对于要进行局部修饰的照片,比如人像照片中要去除皮肤上的瑕疵、柔化皮肤上的光影以及均匀肤色等,想要实现成批处理似乎很困难。 随着人工智能技术的不断发展,越来越多的插件具备自动修…

小家电Type-C接口PD诱骗芯片 6500

随着科技的飞速发展,小家电设备越来越智能化,Type-C接口在小家电设备中的应用也越来越广泛。然而,由于Type-C接口的多样性,如何确保设备能够正确识别并使用各种不同的充电方式,成为了一个亟待解决的问题。这时候&#…

LVGL欢乐桌球游戏(LVGL+2D物理引擎学习案例)

LVGL欢乐桌球游戏(LVGL2D物理引擎学习案例) 视频效果: https://www.bilibili.com/video/BV1if421X7DL