OpenCV修养(二)——OpenCV基本操作

文章目录

  • 2 OpenCV基本操作
    • 2.1 IO操作
    • 2.2 图像基本操作
      • 2.2.1 图像绘制
        • 2.2.1.1 绘制直线
        • 2.2.1.2 绘制圆形
        • 2.2.1.3 绘制矩形
        • 2.2.1.4 添加文字
        • 2.2.1.5 试手
      • 2.2.2 获取/修改图像的像素点
      • 2.2.3 获取图像属性
      • 2.2.4 图像通道拆分/合并
      • 2.2.5 色彩空间改变
      • 2.2.6 边界填充
    • 2.3图像算数操作
      • 2.3.1 图像加法
      • 2.3.2 图像混合

2 OpenCV基本操作

2.1 IO操作

图像的本质是什么?实际上,图像就是矩阵,而是几维矩阵视具体而定。如灰度值图片就是单通道,图片是一个二维矩阵;而对于彩色图片,其拥有三个通道,也就是说,一个图片是三个矩阵堆叠而成。如图所示:

image-20220315153933122

其中矩阵中的每个值我们叫做像素点,每个像素点取值0~255,0是最暗的,即黑色,往上递增越来越亮。如在R通道上,取值211,即红色越来越亮。

我们来导入一张图片试试,我用的是这张,你们可以和我不一样。

image-20220315154806230

cv2.imread(filename,flags)

  • 读取图片
  • filename:字符串类型,用于指定路径
  • flags:整数类型,用于指定图片的加载形式,1为cv.IMREAD_COLOR,表明其以彩色模式加载图像,任何图像的透明度都将被忽略,这是默认参数;0为cv.IMREAD _GRAYSCALE,表明其以灰度模式加载图像;-1为cv.IMREAD_UNCHANGED,表明alpha通道的加载图像模式

cv2.imshow(winname,mat)

  • 用于显示图片
  • winname:显示图片的窗口名称
  • mat:要加载的图片
import cv2# 读取图像
img = cv2.imread(r'C:\Users\13966\Desktop\Test01.jpg', 1)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果不用cv2.waitKey()方法,图片会一闪而过。该方法可以传入整型参数,传入的参数为毫秒,如果传入0,则表示按任意键终止显示图像。cv.destroyAllWindows()方法用于销毁窗口。在平时开发中,我们可以把以上的操作封装为一个函数。

用cv2包读取的RGB图片一般会变成BGR格式,这是需要注意的。

在通常做完操作后我们如何保存一张图片呢?

cv2.imwrite(‘filename’,img)

  • 用于保存图片
  • filename:用于填写图片地址
  • img:图片对象
import cv2# 读取图像
def load_cv_img():img = cv2.imread(r'C:\Users\13966\Desktop\Test01.jpg', 1)cv2.imshow("image", img)cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite(r'C:\Users\13966\Desktop\Test02.jpg', img)load_cv_img()

2.2 图像基本操作

2.2.1 图像绘制

2.2.1.1 绘制直线

cv.line(img,start,end,color,thickness)

  • img:要绘制的参数
  • Start,end:直线的起点和终点
  • color:线条的颜色
  • Thickness:线条宽度

2.2.1.2 绘制圆形

cv.circle(img,centerpoint,r,color,thickness)

  • img:要绘制圆形的图像
  • Centerpoint,r:圆心和半径
  • color:线条的颜色
  • Thickness:线条宽度,为-1时生成闭合图案并添加文字

2.2.1.3 绘制矩形

cv.rectangle(img,leftupper,rightdown,color,thickness)

  • img:要绘制矩形的图像
  • Leftupper,rightdown:矩形的左上角和右下角坐标
  • color:线条的颜色
  • Thickness:线条宽度

2.2.1.4 添加文字

cv.putText(img,text,org,font,fontsize,thickness,cv.LINE_AA)

  • img:图像
  • text:要写入的文本数据
  • org:文本的放置位置
  • font:字体
  • Fontsize:字体大小

2.2.1.5 试手

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1 创建图像
img = np.zeros((512, 512, 3), np.uint8)# 2 绘制图像
cv.line(img, (0, 0), (512, 512), (255, 0, 0), 5)
cv.circle(img, (244, 244), 20, (0, 255, 0), 4)
cv.rectangle(img, (122, 122), (400, 400), (0, 0, 255), 4)
cv.putText(img, "OpenCV", (50, 100), cv.FONT_ITALIC, 3, (144, 144, 0))# 3 显示结果
cv.imshow("image", img)
cv.waitKey(0)
cv.imwrite(r"C:\Users\13966\Desktop\Test03.jpg", img)

out:

image-20220316094548346

在控制颜色这一块,通常是输入BGR值以元组的形式传入;对于字体这一块,通常有多种选择,常用的有:FONT_HERSHEY_SIMPLEX、FONT_HERSHRY_PLAIN等。

2.2.2 获取/修改图像的像素点

这个没什么好说的,因为对于cv读取图像来说,按照前面所讲,其本质上是一个多维数组,所以按照数组的索引方式修改即可。

import cv2 as cv# 读取图片
img = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")# 获取部分像素点
cv.imshow("image", img[0:50, :, :])
cv.waitKey(0)

out:

image-20220316162802525

2.2.3 获取图像属性

图像无非就是n维矩阵。所以属性自然也就是大小、数据类型、形状那几个。

属性API
形状img.shape
图像大小img.size
数据类型img.dtype
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1 创建图像
img = np.zeros((512, 512, 3), np.uint8)# 2 绘制图像
cv.line(img, (0, 0), (512, 512), (255, 0, 0), 5)
cv.circle(img, (244, 244), 20, (0, 255, 0), 4)
cv.rectangle(img, (122, 122), (400, 400), (0, 0, 255), 4)
cv.putText(img, "OpenCV", (50, 100), cv.FONT_ITALIC, 3, (144, 144, 0))print(f"图像大小{img.size}")
print(f"图像的形状{img.shape}")
print(f"图像的数据类型{img.dtype}")

2.2.4 图像通道拆分/合并

有时候需要在cv读取的BGR图像中进行单通道工作,这个时候我们需要使用split方法,而如果想要把处理好的各个通道合并,可以使用merge方法。

import cv2 as cvimg = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("image", grayImg)

out:

image-20220316110423656

2.2.5 色彩空间改变

OpenCV中有150多种颜色空间的转换方法,这些方法你可以这么记忆:如果你想从A->B,那么可以调用cv.A2B。如BGR转Gray,则调用包里的BGR2GRAY。

import cv2 as cv# 1 创建图像
img = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")# 2 通道拆分
b, g, r = cv.split(img)
cv.imshow("b_image", b)
cv.waitKey(0)
cv.destroyAllWindows()

out:

image-20220316110454121

2.2.6 边界填充

cv.copyMakeBorder(src,top,bottom,left,right,BorderType)

  • 用于边界填充
  • src:填充图像
  • BorderType:填充类型
  • BORDER_REPLICATE:赋值法,复制最边缘的像素填充
  • BORDER_REFLECF:反射法,对感兴趣的图像中的像素在两边进行复制
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴
  • BORDER_WRAP:外包装法,如cdefgh[abcdefgh]abcdefg
  • BORDER_CONSTANT:常数法,用常数值填充,所以要指定value
import cv2 as cv
import matplotlib.pyplot as plt# 读取图片
img = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")# 指定填充位置
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)# 填充边界
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT101)
wrap = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_WRAP)
constant = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_CONSTANT, value=0)# 显示图片
plt.subplot(231)
plt.imshow(img, '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('REFLECT101')
plt.subplot(235)
plt.imshow(wrap, 'gray')
plt.title('WRAP')
plt.subplot(236)
plt.imshow(constant, 'gray')
plt.title('CONSTANT')plt.show()

out:

image-20220316165351702

2.3图像算数操作

2.3.1 图像加法

我们可以使用OpenCV中的cv.add()函数将两个图片相加,或者可以简单通过numpy操作添加两个图像,如res = img1+img2,两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。

需要注意的是,OpenCV和Numpy加法之间存在差异,OpenCV的加法是饱和操作,如果两个图片是一样的,并且做加法,那么图片会变得饱和度非常高;而Numpy添加是模运算,其做出来的效果不是很好。

import cv2 as cvimg = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")
img2 = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")
mulImg = cv.add(img, img2)
cv.imshow("image", mulImg)
cv.waitKey(0)
print(img)
print(img2)

out:

image-20220316111811929

我们试着将两张不同的图片做加法。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1 创建图像
img = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")
img2 = cv.imread(r"C:\Users\13966\Desktop\Test02.jpg")
mulImg = cv.add(img, img2)
cv.imshow("image", mulImg)
cv.waitKey(0)

另一张图片是这个(合并前必须保证两图片大小相同且通道数相同):

image-20220316112312664

out:

image-20220316112406229

2.3.2 图像混合

图像混合实际上等于加强版的图像加法,它可以控制两图片的透明度比例。换而言之,图像混合可以控制合成图片中原先各图片的占比。

想要使用图像混合,只需要使用addWeighted()方法即可。

混合公式为:g(x)=a⋅img1+b⋅img2+γg(x) = a·img1+b·img2+\gammag(x)=aimg1+bimg2+γ

import cv2 as cv# 1 创建图像
img = cv.imread(r"C:\Users\13966\Desktop\Test01.jpg")
img2 = cv.imread(r"C:\Users\13966\Desktop\Test02.jpg")
mulImg = cv.addWeighted(img, 0.2, img2, 0.8, 0)
cv.imshow("image", mulImg)
cv.waitKey(0)

out:

image-20220316113239926

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

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

相关文章

ylbtech-LanguageSamples-Porperties(属性)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Porperties(属性)1.A,示例(Sample) 返回顶部“属性”示例 本示例演示属性为何是 C# 编程语言必不可少的一个组成部分。它演示了如何声明和使用属性。有关更多信息,请参见属性(C# 编…

Altium Designer敷铜的规则设定

InPolygon 这个词是铺铜对其他网络的设置,铺铜要离其他网络远点,因为腐蚀不干净会对 电路板有影响... 问题一:: 如下图所示,现在想让敷铜与板子边界也就是keepoutlayer的间距小一点,比如0.2MM。而与走线的间距比较大,比如0.8mm。要怎么设置规…

OpenCV修养(三)——图像处理(上)

文章目录致谢3 图像处理(上)3.1 几何变换3.1.1 图像缩放3.1.2 图像平移3.1.3 图像旋转3.1.4 仿射变换3.2 图像阈值3.3 图像平滑3.3.1 图像噪声3.3.1.1 椒盐噪声3.3.1.2 高斯噪声3.3.2 均值滤波3.3.3 方框滤波3.3.4 高斯滤波3.3.5 中值滤波3.3.6 小结3.4 …

机器学习的练功方式(十一)——逻辑回归

文章目录致谢11 逻辑回归11.1 引入11.2 激活函数11.3 损失函数11.4 梯度下降11.5 案例:癌症分类预测致谢 逻辑回归为什么用Sigmoid? - 知乎 (zhihu.com) 逻辑回归中的损失函数的解释_yidiLi的博客-CSDN博客_逻辑回归损失函数 11 逻辑回归 逻辑回归也被称…

【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈

【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈 原文:【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈摘要: 你玩魔兽不?你知道如何做一张魔兽地图不…

linux系统分两种更普遍的包,rpm和tar,这两种安装包如何解压与安装

2019独角兽企业重金招聘Python工程师标准>>> RPM软件包管理器&#xff1a;一种用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。rpm -ivh xxxx.rpm <-安装rpm包 -i install的意思 -v view 查看更详细的…

C++类的数组元素查找最大值问题

找出一个整型数组中的元素的最大值。 1 /*找出一个整型数组中的元素的最大值。*/2 3 #include <iostream>4 using namespace std;5 6 class ArrayMax //创建一个类7 {8 public :9 void set_value(); 10 void max_value(); 11 void sh…

C++从0到1的入门级教学(二)——数据类型

文章目录2 数据类型2.1 简单变量2.2 基本数据类型2.2.1 整型2.2.2 实型&#xff08;浮点型&#xff09;2.2.3 字符型2.2.4 布尔类型2.3 sizeof关键字2.4 类型转换2.5 转义字符2.6 重新谈及变量2.6.1 字面值常量2.6.2 变量2.6.3 列表初始化2.7 数据的输入2 数据类型 2.1 简单变…

深度学习修炼(三)——自动求导机制

文章目录致谢3 自动求导机制3.1 传播机制与计算图3.1.1 前向传播3.1.2 反向传播3.2 自动求导3.3 再来做一次3.4 线性回归3.4.1 回归3.4.2 线性回归的基本元素3.4.3 线性模型3.4.4 线性回归的实现3.4.4.1 获取数据集3.4.4.2 模型搭建3.4.4.3 损失函数3.4.4.4 训练模型3.5 后记致…

深度学习修炼(四)——补充知识

文章目录致谢4 补充知识4.1 微积分4.1.1 导数和微分4.1.2 偏导数4.1.3 梯度4.1.4 链式求导4.2 Hub模块致谢 导数与微分到底有什么区别&#xff1f; - 知乎 (zhihu.com) 4 补充知识 在这一小节的学习中&#xff0c;我们会对上一小节的知识点做一个补充&#xff0c;并且拓展一个…

java使用POI jar包读写xls文件

主要使用poi jar来操作excel文件。代码中用到的数据库表信息见ORACLE之表。使用public ArrayList<Person> getPersonAllRecords()获得所有的记录。 1 public class PersonXLS {2 3 public static void main(String[] args) throws IOException {4 5 …

深度学习修炼(五)——基于pytorch神经网络模型进行气温预测

文章目录5 基于pytorch神经网络模型进行气温预测5.1 实现前的知识补充5.1.1 神经网络的表示5.1.2 隐藏层5.1.3 线性模型出错5.1.4 在网络中加入隐藏层5.1.5 激活函数5.1.6 小批量随机梯度下降5.2 实现的过程5.2.1 预处理5.2.2 搭建网络模型5.3 简化实现5.4 评估模型5 基于pytor…

Android 应用程序集成FaceBook 登录及二次封装

1、首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台 https://developers.facebook.com/apps 2、创建账号并且获得 APP ID 图一 图二 图三 图四 图五 3、获取app签名的Key Hashes 值&#xff08;两种方式&#xff09; 3.1方法1&#xff1…

IKAnalyzer进行中文分词和去停用词

最近学习主题模型pLSA、LDA&#xff0c;就想拿来试试中文。首先就是找文本进行切词、去停用词等预处理&#xff0c;这里我找了开源工具IKAnalyzer2012&#xff0c;下载地址&#xff1a;(&#xff1a;(注意&#xff1a;这里尽量下载最新版本&#xff0c;我这里用的IKAnalyzer201…

C++从0到1的入门级教学(六)——函数

文章目录6 函数6.1 概述6.2 函数的定义6.3 函数的调用6.4 值传递6.5 函数的常见形式6.6 函数的声明6.7 函数的分文件编写6 函数 6.1 概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码。 一个较大的程序&#xff0c;一般分为若干个程序块&#xf…

PC实用手册

为什么80%的码农都做不了架构师&#xff1f;>>> ##Win10除了Edge/IE&#xff0c;其他浏览器打开和载入速度都很慢 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;输入netsh winsock reset重置winsock&#xff0c;然后重启电脑即可 转载于:https://my.oschin…

MySQL之表的约束

一 介绍 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性主要分为&#xff1a; PRIMARY KEY (PK) 标识该字段为该表的主键&#xff0c;可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标…

eclipse静态部署tomcat

转载于:https://www.cnblogs.com/sprinng/p/4223798.html

jvm fastdebug

背景 RednaxelaFX 写道agapple 写道还有一个问题&#xff0c;就是在验证一些逃逸优化时&#xff0c;有些jvm参数用不了&#xff0c;比如-XX:printInlining&#xff0c;-XX:printAssembly&#xff0c;jdk用的是1.6.11和jdk1.6.18-XX:PrintInlining在product build的Sun JDK上可以…

hmailserver批量添加用户

2019独角兽企业重金招聘Python工程师标准>>> 将内容复制到txt文件中后缀改为vbs 将用户名密码替换为自己的 脚本内容如下: Option Explicit On Error resume nextDim obBaseApp Dim objFSO Dim objTextFile Dim strNewAlias,iDim scrreport Dim failed Dim added fa…