文章目录

  • 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操作

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

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

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

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:

在控制颜色这一块,通常是输入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:

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:

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:

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:

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:

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

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)

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

out:

2.3.2 图像混合

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

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

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

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:

OpenCV修养(二)——OpenCV基本操作相关推荐

  1. OpenCV基础入门系列基本操作——贰

    系列博文第二篇,关于OpenCV4的一些基本操作和使用. 博文主要以实例展示不同的函数使用方法. OpenCV基础入门系列基本操作--壹 前言 下述为本博文需要用到的各类头文件以及全局变量等 读者可根 ...

  2. OpenCV:day01-图像基本操作

    OpenCV:day01-图像基本操作 文章目录 OpenCV:day01-图像基本操作 一.读取图片.视频.摄像头 二.写入图片 三.操作像素 四.创建图像 五.图像剪切 六.图像镜像 七.图像缩放 ...

  3. 使用Python,Opencv进行二维直方图的计算及绘制

    使用Python,Opencv进行二维直方图的计算及绘制 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python,Opencv进行二维直方图的计算及绘制(分别用Opencv和Numpy计算 ...

  4. opencv:在二维定标中的应用

    [写在前面] opencv在二维定标中的应用 参考链接: http://www.cnblogs.com/chita/ OPENCV立体标定 https://wenku.baidu.com/view/e ...

  5. OpenCV差分二值化的实时场景文本检测的实例(附完整代码)

    OpenCV差分二值化的实时场景文本检测的实例 OpenCV差分二值化的实时场景文本检测的实例 OpenCV差分二值化的实时场景文本检测的实例 OpenCV差分二值化的实时场景文本检测的实例(附完整代 ...

  6. OpenCV展开二维相位图

    OpenCV展开二维相位图 展开二维相位图 目标 代码 解释 展开二维相位图 目标 在本教程中,您将学习如何使用相位展开模块来展开二维相位图 代码 #include <opencv2/imgpr ...

  7. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  8. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  9. OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

    OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...

  10. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

最新文章

  1. python控制台颜色输出以及字符串格式化输出
  2. dubbo官方文档中文_Pandas中文官方文档:基础用法5
  3. “阿姨我不想努力了”,阿姨的回复让我重燃斗志!
  4. jvm性能调优 - 21案例实战_百万级用户的在线系统如何基于G1垃圾回收器优化性能
  5. 复制当前光标所在单词句子
  6. boost::hana::at_c用法的测试程序
  7. leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
  8. 开发 一个尴尬的角色
  9. 第6章 循环结构程序设计
  10. 用python写一个除法的函数_2、Python基础--除法、常用数学函数
  11. flume流程之taildir-memory-hdfs
  12. 隐式类型转换 与 隐式类型转换操作符
  13. IKVM.NET_第二篇_应用
  14. 【Flutter从入门到实战】⑰Flutter的主题风格、Theme、DarkTheme暗黑模式、单独给单个页面设置Theme、屏幕适配、屏幕适配工具类封装、Flutter调试使用
  15. Tomcat8下载及安装配置教程(官网)
  16. 2019年博客排名前十
  17. android仿微信录制短视频并播放视频
  18. 简单介绍一下HBase、Cassandra、Voldemort、Redis、VoltDB、MySQL(转)
  19. GCC自带的一些builtin内建函数
  20. GraphGallery,一个基于TensorFlow 2.x与 PyTorch 的GNN benchmark 框架

热门文章

  1. 14-angular.isDefined
  2. 《软件工程(第4版?修订版)》—第1章1.5节 系统的方法
  3. cardsui-for-android
  4. apache代理IIS的80端口实现共存
  5. Windows2003+SQL2000的集群安装手册
  6. [MySQL FAQ]系列 -- 数据不算大,备份却非常慢
  7. protobuf java 生成_protobuf代码生成
  8. 剑指 Offer 37. 序列化二叉树
  9. 建造者模式什么时候使用?
  10. 昆西·拉森的净资产是多少?