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天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
11天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
17天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
18天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
6天前
|
机器学习/深度学习 人工智能 算法
图像处理与分析:Python中的计算机视觉应用
【4月更文挑战第12天】Python在计算机视觉领域广泛应用,得益于其丰富的库(如OpenCV、Pillow、Scikit-image)和跨平台特性。图像处理基本流程包括获取、预处理、特征提取、分类识别及重建生成。示例代码展示了面部和物体检测,以及使用GAN进行图像生成。
|
1天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
12 0
|
2天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
22 0
|
3天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
5天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。

热门文章

最新文章