Python编程:cv2模块对图像处理的基本操作

简介: Python编程:cv2模块对图像处理的基本操作

安装

pip install opencv-python

CV2实践所用到的图片

bug.png

20181221185212410.png

1、简单读写

import cv2
# 读入图像
img = cv2.imread("source/bug.png")
# 显示图像
cv2.imshow("bug", img)
cv2.waitKey(0)  # 单位毫秒
cv2.destroyWindow("bug")
# 复制图像
new_img = img.copy()
# 保存图像
cv2.imwrite("bug-new.png", new_img)

显示如下:

20181221185441110.png

2、图片翻转

im = cv2.imread("source/bug.png")
new_img = cv2.flip(im, flipCode=0)
cv2.imwrite("source/bug-flip-0.png", new_img)

Vertical垂直翻转(沿X轴)flipCode=0

原图:

20181221185212410.png

翻转图:

20181221192700894.png

Horizontal水平翻转(沿Y轴)flipCode=1

20181221185212410.png20181221192803474.png

horizontal and vertical 水平和垂直翻转(沿中心点)flipCode=-1

20181221185212410.png20181221192811404.png

3、色彩变换

彩色图像转为灰度图像?

im = cv2.imread("source/bug.png")
new_img = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
cv2.imwrite("source/bug-gray.png", new_img)

cv2.COLOR_X2Y

其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

2018122119404343.png

4、给图片加文本

  1. 加英文字符
img = cv2.imread("source/bug.png", cv2.IMREAD_COLOR)
# 图片对象、文本、像素、字体、字体大小、颜色、字体粗细
new_img = cv2.putText(
    img=img,
    text="OOXX",
    org=(60, 50),
    fontFace=cv2.FONT_HERSHEY_SIMPLEX,
    fontScale=1,
    color=(255, 0, 0),
    thickness=2
)
cv2.imwrite("source/bug-text.png", new_img)

20181221195911226.png

  1. 添加中文字符

opencv自带的putText函数无法输出中文字符,需要借助Pillow

安装

pip install pillow numpy

代码示例

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 1、将cv2转为PIL
img = cv2.imread("source/bug.png")
# cv2和PIL中颜色的hex码的储存顺序不同
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(img)
# 2、PIL图片上打印中文
draw = ImageDraw.Draw(pil_img)
font = ImageFont.truetype(font="华文黑体.ttf", size=20, encoding="utf-8")
draw.text(xy=(50, 20), text="爱我中华", fill=(0, 0, 255), font=font)
# 3、PIL图片转cv2
new_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
cv2.imwrite("source/bug-text.png", new_img)

Mac本字体路径,选一个已有的字体

1、/System/Library/Fonts

2、/Library/Fonts

20181221201525555.png

参考:

opencv3.2将中文输出到图片上

5、绘图

import numpy as np
import cv2
# 常用颜色值
RED = (0, 0, 255)
GREEN = (0, 255, 0)
BLUE = (255, 0, 0)
np.set_printoptions(threshold='nan')
# 创建一个宽512高512的黑色画布,RGB(0,0,0)即黑色
img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)
# 画直线,图片对象,起始坐标(x轴,y轴),结束坐标,颜色,宽度
cv2.line(
    img=img,
    pt1=(0, 0),
    pt2=(311, 511),
    color=BLUE,
    thickness=10
)
# 画矩形,图片对象,左上角坐标,右下角坐标,颜色,宽度
cv2.rectangle(
    img=img,
    pt1=(30, 166),
    pt2=(130, 266),
    color=GREEN,
    thickness=3
)
# 画圆形,图片对象,中心点坐标,半径大小,颜色,宽度
cv2.circle(
    img=img,
    center=(222, 222),
    radius=50,
    color=(255.111, 111),
    thickness=-1
)
# 画椭圆形,图片对象,中心点坐标,长短轴,顺时针旋转度数,开始角度(右长轴表0度,上短轴表270度),颜色,宽度
cv2.ellipse(
    img=img,
    center=(333, 333),
    axes=(50, 20),
    angle=0,
    startAngle=0,
    endAngle=150,
    color=RED,
    thickness=-1
)
# 画多边形,指定各个点坐标,array必须是int32类型
pts = np.array(
    [[10, 5], [20, 30], [70, 20], [50, 10]],
    dtype=np.int32
)
# -1表示该纬度靠后面的纬度自动计算出来,实际上是4
pts = pts.reshape((-1, 1, 2,))
# print(pts)
# 画多条线,False表不闭合,True表示闭合,闭合即多边形
cv2.polylines(
    img=img,
    pts=[pts],
    isClosed=True,
    color=(255, 255, 0),
    thickness=5
)
# 添加文字 图片对象,要写的内容,左边距,字的底部到画布上端的距离,字体,大小,颜色,粗细
cv2.putText(
    img=img,
    text="OpenCV",
    org=(10, 400),
    fontFace=cv2.FONT_HERSHEY_SCRIPT_COMPLEX,
    fontScale=3.5,
    color=(255, 255, 255),
    thickness=2
)
cv2.imwrite("picture.jpg", img)

20181221204814456.jpg

6、图像的表示

20181221211510295.png

图A

来自:https://www.cnblogs.com/shizhengwen/p/8719062.html


3维数组


单通道的灰度图像在计算机中的表示:一个8位无符号整形的矩阵

多通道表示 : 第一个维度是高度,第二个维度是高度,第三个维度是通道


表达方式: 高度×宽度×通道数,H×W×C

深度学习: C×H×W (就是把每个通道都单独表达成一个二维矩阵, 如图A-c)


OpenCV默认图像表示:BGR


////

import numpy as np
import cv2
import matplotlib.pyplot as plt
# 矩阵
img = np.array([
    [[255, 0, 0], [0, 255, 0], [0, 0, 255]],
    [[255, 255, 0], [255, 0, 255], [0, 255, 255]],
    [[255, 255, 255], [128, 128, 128], [0, 0, 0]],
], dtype=np.uint8)
# 用matplotlib存储
plt.imsave('img_pyplot.jpg', img)
# 用OpenCV存储
cv2.imwrite('img_cv2.jpg', img)

左边:img_pyplot.jpg

右边:img_cv2.jpg

20181221210900610.png20181221210942665.png

参考:

模块cv2的用法

相关文章
|
7天前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
7天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
7天前
|
设计模式 机器学习/深度学习 前端开发
Python 高级编程与实战:深入理解设计模式与软件架构
本文深入探讨了Python中的设计模式与软件架构,涵盖单例、工厂、观察者模式及MVC、微服务架构,并通过实战项目如插件系统和Web应用帮助读者掌握这些技术。文章提供了代码示例,便于理解和实践。最后推荐了进一步学习的资源,助力提升Python编程技能。
|
8天前
|
数据采集 搜索推荐 C语言
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化和调试技巧,涵盖使用内置函数、列表推导式、生成器、`cProfile`、`numpy`等优化手段,以及`print`、`assert`、`pdb`和`logging`等调试方法。通过实战项目如优化排序算法和日志记录的Web爬虫,帮助你编写高效稳定的Python程序。
|
5天前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
5天前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
8天前
|
数据采集 人工智能 数据挖掘
Python 编程基础与实战:从入门到精通
本文介绍Python编程语言,涵盖基础语法、进阶特性及实战项目。从变量、数据类型、运算符、控制结构到函数、列表、字典等基础知识,再到列表推导式、生成器、装饰器和面向对象编程等高级特性,逐步深入。同时,通过简单计算器和Web爬虫两个实战项目,帮助读者掌握Python的应用技巧。最后,提供进一步学习资源,助你在Python编程领域不断进步。
|
8天前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
8天前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
10天前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
31 8

热门文章

最新文章