Python---Opencv图像处理入门教程 第一期

Opencv

第一章:图像基本操作

1.1 读取图像imread()

img = cv2.imread("img.jpg")#图片路径
print(img)

1.2 显示图像imshow()

cv2.imshow("窗口名",图片路径)
#图片路径是读取图片返回的地址
cv2.imshow("imgage",img)
#与读取键盘按键同时使用
cv2.WaitKey() #返回值为 所按按键的ASCII码值
参数cv2.WaitKey(delay) #delay为窗口存在的时间 单位为ms
#例如
retval = cv2.waitKey(delay)

1.3 销毁窗口cv2.destroyAllWindows()

cv2.destroyAllWindows()
#销毁所有窗口

1.4 保存图像

cv2.imwrite(filename,img)
#filename 保存图像的完整路径
#img 要保存的图像

1.5 获取图像性质

图像的基本属性:shape、size、dtype

shape : 彩色图像 获得图像的水平像素、垂直像素、通道数

​ 灰度图像 获得图像的水平像素、垂直像素、

size : 获取图像包含的像素个数 值为(水平像素 * 垂直像素 * 通道数(3个 (RGB)))

​ 灰度图像的通道数为1

dtype:获取图像的数据类型

import cv2

a = cv2.imread("imgage/2.jpg")
print("shape = ",  a.shape)
print(a.size)
print(a.dtype)
print("\n")

b = cv2.imread("imgage/2.jpg", 0)
print(b.shape)
print(b.size)
print(b.dtype)

#输出结果
shape =  (747, 1269, 3)
2843829
uint8

(747, 1269)
947943
uint8

第二章 像素的操作

2.1 : 像素

2.1.1确定像素的位置
import cv2
img = cv2.imread("imgage/2.jpg")
px = img[100, 100]
2.1.2 获取像素的RGB值
import cv2
img = cv2.imread("imgage/2.jpg")
px1 = img[100, 100, 0]
px2 = img[100, 100, 1]
px3 = img[100, 100, 2]
print(px1, px2, px3)
#结果
#255 250 241

2.2修改像素的RGB值

2.2.1修改单个像素点的RGB值
import cv2
img = cv2.imread("imgage/2.jpg")
px1 = img[100, 100]
print('修改前的像素值为', px1)
px2 = img[100, 100, 1]
px3 = img[100, 100, 2]
px1 = [100, 100, 100]
print(px2, px3, '\n', '修改后的像素值为', px1)

#输出
修改前的像素值为 [255 250 241]
250 241 
修改后的像素值为 [100, 100, 100]

R=G=B=0为纯黑

R=G=B=255为纯白色

2.2.2 修改某范围内的像素值

将某范围内的像素都变为白色

import cv2
img = cv2.imread("imgage/2.jpg")
cv2.imshow("1", img)
for i in range(100, 140):
    for x in range(100, 145):
        img[i, x] = [0, 0, 0]
cv2.imshow("2", img)
cv2.waitKey()
print(img)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60n0X6wt-1657876040642)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713172745884.png)]

2.3 使用NumPy模块操作像素

2.3.1 NumPy概述

NumPy是c语言实现的所以速度非常快

一、有一个强大的N维数组对象(ndarray)

二、广播功能方法

三、线性代数、傅里叶变换、随机数生成、图形操作等功。

四、整合c/c++/Fortran代码的工具

2.3.2 数组的类型

NumPy数据类型

bool_布尔型数据类型(True 或者 False)
int_默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc与 C 的 int 类型一样,一般是 int32 或 int 64
intp用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8字节(-128 to 127)
int16整数(-32768 to 32767)
int32整数(-2147483648 to 2147483647)
int64整数(-9223372036854775808 to 9223372036854775807)
uint8无符号整数(0 to 255)
uint16无符号整数(0 to 65535)
uint32无符号整数(0 to 4294967295)
uint64无符号整数(0 to 18446744073709551615)
float_float64 类型的简写
float16半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_complex128 类型的简写,即 128 位复数
complex64复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128复数,表示双 64 位浮点数(实数部分和虚数部分)
datatime64使日期时间类型
timedalta两个时间之间的间隔

numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

每一种数据类型都有相应的数据转换方式

import numpy as np
print(np.int8(3.14))
print(np.float64(3.14))
print(np.float16(True))
#输出
3
3.14
1.0

2.4 创建数组

2.4.1 最常规的array()方法
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)
2.4.1.1创建一维和二维数组
import numpy as np
n1 = np.array([1, 2, 3])
n2 = np.array([0.1, 0.2, 0.3])
n3 = np.array([[1, 2], [2, 3]])
print(n1, '\n', n2, '\n', n3)
[1 2 3] 
 [0.1 0.2 0.3] 
 [[1 2]
 [2 3]]
2.4.1.2创建浮点型数组
import numpy as np
list1 = [1, 2, 3]
n1 = np.array(list1, dtype=np.float_)
print(n1)
print(n1.dtype)
print(n1[0])
#输出
[1. 2. 3.]
float64
1.0
2.4.1.3创建三维数组
import numpy as np
list1 = [1, 2, 3]
n1 = np.array(list1, dtype=np.float_, ndmin=3)
print(n1)
print(n1[0])
#输出
[[[1. 2. 3.]]]
[[1. 2. 3.]]
2.4.1.4创建未初始化的2行3列数组
import numpy as np
n = np.empty([2, 3])
print(n)
#输出
[[0.   0.15 0.25]
 [0.5  0.75 1.  ]]
2.4.1.5创建用0填充的数组
import numpy as np
n = np.zeros([2, 3], np.uint8)
print(n)
#输出
[[0 0 0]
 [0 0 0]]
2.3.1.6创建用1填充的数组
import numpy as np
n = np.ones([2, 3], np.uint8)
print(n)
#输出
[[1 1 1]
 [1 1 1]]
2.4.1.7创建随机数组
#np.random.randint(low, hight, size)
import numpy as np
n = np.random.randint(0, 255, 10)
print(n)
#在0 和 254之间随机生成10个数字
#low 与 hight 可以为负

2.5 操作数组

2.5.1 加法、减法、乘法、除法、幂运算
import numpy as np
n1 = np.array([1, 2])
n2 = np.array([3, 4])
print('加法运算',n1 + n2)
print('减法运算',n1 - n2)
print('乘法运算',n1 * n2)
print('除法运算',n1 / n2)
print('幂运算', n1 ** n2)
#输出
#加法运算 [4 6]
#减法运算 [-2 -2]
#乘法运算 [3 8]
#除法运算 [0.33333333 0.5]
幂运算 [ 1 16]
2.5.2比较运算
import numpy as np
n1 = np.array([1, 2])
n2 = np.array([3, 4])
print(n1 >= n2)
print(n1 <= n2)
print(n1 == n2)
print(n1 != n2)
#输出
[False False]
[ True  True]
[False False]
[ True  True]
2.5.3 复制数组
import numpy as np
n1 = np.array([1, 2])
n2 = np.array(n1, copy=True)
print(n1, n2)
#输出
[1 2] 
[1 2]

2.6 数组的索引和切片

2.6.1 :索引

类似于数组下标

import numpy as np
n1 = np.array([1, 2, 3, 4])
print(n1[0], n1[3])
#输出
1 4
2.6.2 切片
import numpy as np
n1 = np.array([1, 2, 3, 4])
print(n1[0])
print(n1[1])
print(n1[0:2])
print(n1[1:])
print(n1[:2])
#输出
1
2
[1 2]
[2 3 4]
[1 2]
2.6.3二维数组索引
import numpy as np
n1 = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 10, 11]])
print(n1[-1])
print(n1[2, 3])
print(n1[1])
#输出
[ 8  9 10 11]
11
[4 5 6 7]
2.6.4二维数组切片式索引
import numpy as np
n1 = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 10, 11]])
print(n1[::-1, ::-1])
print(n1[::1, ::1])
print(n1[:3:2, :3:2])
#输出
[[11 10  9  8]
 [ 7  6  5  4]
 [ 4  3  2  1]]
[[ 1  2  3  4]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 1  3]
 [ 8 10]]

2.7 创建图像

2.7.1创建全黑图像
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width), np.uint8)
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()
输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9uOOIfIq-1657876040644)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713215021559.png)]

输出y = 100 x=200的全黑图像

2.7.2创建纯白图像
import numpy as np
import cv2
width = 200
height = 100
img = np.ones((height, width), np.uint8) * 255
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0NtBhtI-1657876040645)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713215440574.png)]

2.7.3在黑像素中创建一块白
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width), np.uint8)
img[25:75:, 100:150:] = 255
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KsjZF0qV-1657876040646)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713220324709.png)]

2.7.4创建黑白相间的图像
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width), np.uint8)
for x in range(0, width, 40):
    img[:, x:x+20] = 255
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuFDfyKb-1657876040646)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713222744929.png)]

2.7.5创建彩色图像
import numpy as np
import cv2
width = 200
height = 100
img = np.zeros((height, width, 3), np.uint8)
blue = img.copy()
blue[:, :, 0] = 255
green = img.copy()
green[:, :, 1] = 255
red = img.copy()
red[:, :, 2] = 255
cv2.imshow("1", blue)
cv2.imshow("2", green)
cv2.imshow("3", red)
cv2.waitKey()
cv2.destroyAllWindows()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKpfwLJQ-1657876040647)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713223633784.png)]

2.7.6生成随机图像
import numpy as np
import cv2
width = 200
height = 200
img = np.random.randint(256, size=(height, width), dtype=np.uint8)
cv2.imshow("1", img)
cv2.waitKey()
cv2.destroyAllWindows()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mI4DYcP0-1657876040647)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713224145487.png)]

2.8拼接图像

2.8.1水平拼接、垂直拼接
import numpy as np
import cv2
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])
d = array = np.hstack((a, b, c))
e = array = np.vstack((a, b, c))
print(d)
print(e)

#输出
[1 2 3 4 5 6 7 8 9]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
2.8.2在图像处理中的应用

可拼接2幅图像

第三章色彩空间与通道

3.1色彩空间

GRAY色彩空间指灰度图像,‘0’表示纯黑色,‘255’表示纯白色

3.1.1从RGB色彩空间转换到GRAY色彩空间

G r a y = R ∗ 0.299 + G ∗ 0.857 + B ∗ 0.114 Gray = R * 0.299 + G * 0.857 + B * 0.114 Gray=R0.299+G0.857+B0.114

3.1.2从GRAY色彩空间转换到RGB色彩空间时

R = G r a y / / G = G r a y / / B = G r a y R = Gray// G = Gray// B = Gray R=Gray//G=Gray//B=Gray

3.1.3RGB与HSV互转

img

img
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值