1.图片读写
1.1 图片的读入与显示
import cv2
# cv2读入图片 cv2.imread('图片的路径')
image = cv2.imread('cat.jpg')
# 显示图片
cv2.imshow('the cat', image)
# 让图片窗口持续显示,没有加此语句,图片会一闪而过
cv2.watiKey(0)
1.2 图片格式转换
在指定的目录下,会产生新格式的图片文件。
import cv2
# 读入原图
image = cv2.imread('cat.jpg')
# 图片格式转换并存储
cv2.imwrite('cat.png', image)
1.3 图片的缩放
图片的裁剪用 cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)
参数 | 说明 |
---|---|
InputArray src | 输入原图 |
OutputArray dst | 输出图片 |
Size | 输出图片尺寸 |
fx, fy | 沿x轴,y国的缩放系数 |
interpolation | 插入方式 |
interpolation 选项所用的插值方法:
INTER_NEAREST | 最近邻插值 |
---|---|
INTER_LINEAR | 双线性插值(默认设置) |
INTER_AREA | 使用像素区域关系进行重采样 |
INTER_CUBIC | 输出图片尺寸 |
fx, fy | 沿x轴,y国的缩放系数 |
interpolation | 插入方式 |
1.3.1 双线性插值法
import cv2
# 双线性插值法
# 读入原图
image = cv2.imread('cat.jpg')
# 获取原图的长、宽,并对应将值存储在x, y
x, y = image.shape[: 2]
# 显示原图
cv2.imshow('Original Picture', image)
# 将图的长宽缩放为原图的三分之一
image_test1 = cv2.resize(image, (int(y / 3), int(x / 3)))
# 显示缩小后的图
cv2.imshow('resize0', image_test1)
# 保存缩小后的图
cv2.imwrite('small_cat.jpg', image_test1)
cv2.waitKey(0)
原图:
缩小后的图:
1.3.2 最近邻插值法
import cv2
# 读入原图
image = cv2.imread('cat.jpg')
# 显示原图
cv2.imshow('Original Picture', image)
# 将y轴、x轴变为原图的四分之一
image_test2 = cv2.resize(image, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)
# 显示缩小后的图
cv2.imshow('resize1', image_test2)
# 保存缩小后的图
cv2.imwrite('_0.25_cat.jpg', image_test2)
cv2.waitKey()
cv2.destroyAllWindows()
缩小后的图:
1.4 灰度图片
当我们用 cv2.imread() 读入一幅图时,默认是返回BGR的彩色图片,要返回一个灰度图片,可以在 cv2.imread() 中在传入一个参数 flags=cv2.IMREAD_GRAYSCALE)。
import cv2
# 读入原图,并通过传入 flags 参数,将图转化为灰度图片
image = cv2.imread('C:/Users/77925/Desktop/cat.jpg', flags=cv2.IMREAD_GRAYSCALE)
# 将原图的长宽缩小为原来的0.25倍
test = cv2.resize(image, (0, 0), fx=0.25, fy=0.25)
# 显示缩小后的图
cv2.imshow('test picture', test)
# 保存缩小后的图到指定位置
cv2.imwrite('C:/Users/77925/Desktop/test_cat.jpg', test)
cv2.waitKey()
结果如下:
3. 边缘检测
边缘检测,通俗地说也就是将物体的边缘区域转化为白色或其他颜色,而非边缘区域转化为黑色。opencv 中用于边缘检测的滤波函数有:Laplacian, Sobel, Scharr, Canny等。
在对图片进行边缘检测过程中,容易将噪声错误地识别为边缘,所以在进行边缘检测前,通常进行模糊处理。
opencv中的模糊滤波器有:blur, medianBlur, GausianBlur等。
import cv2
# 读入原图
image = cv2.imread('C:/Users/77925/Desktop/cat.jpg')
# 模糊滤波器
GBlur = cv2.GaussianBlur(image, (3, 3), 0)
# 边缘检测滤波器
canny = cv2.Canny(GBlur, 50, 150)
# 显示图片
cv2.imshow('image', image)
cv2.imshow('canny', canny)
cv2.imwrite('C:/Users/77925/Desktop/cathaha.jpg', canny)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
4.通道
4.1 拆分通道
import cv2 as cv
# 读入一张RGB图像
cat = cv.imread('photo\\cat.jpg', cv.IMREAD_UNCHANGED)
# 一次性拆分通道
b, g, r = cv.split(cat)
'''
也可以只拆分单个通道
b = cv.split(cat)[0]
g = cv.split(cat)[1]
r = cv.split(cat)[2]
'''
# 显示拆分通道后的图像,每个通道为一个单通道的灰度图像
cv.imshow('B', b)
cv.imshow('G', g)
cv.imshow('R', r)
cv.imshow('cat', cat)
cv.waitKey(0)
cv.destroyAllWindows()
4.2 通道合并
import cv2 as cv
import numpy as np
# 读入一张RGB图像
cat = cv.imread('photo\\cat.jpg', cv.IMREAD_UNCHANGED)
# 拆分通道
b, g, r = cv.split(cat)
# 显示原图像
cv.imshow('original', cat)
# 合并通道,注意合并通道的顺序必须是 b,g,r
m = cv.merge([b, g, r])
# 显示合并后的图像
cv.imshow('result', m)
# 按r,g,b顺序合并图像
rgb = cv.merge([r, g, b])
cv.imshow('rgb', rgb)
# 用某个通道与另外两个全是0的通道合并
# 查看原图像的行列数及通道数
rows, clos, chn = cat.shape
# 拆分出b通道
b = cv.split(cat)[0]
# 生成另外两个全0通道
g = np.zeros([rows, clos], cat.dtype)
r = np.zeros([rows, clos], cat.dtype)
# 合并图像
mm = cv.merge([b, g, r])
# 显示合并后的图像
cv.imshow('mm', mm)
# 其他通道组合类似上边
cv.waitKey(0)
cv.destroyAllWindows()
5. 图像加法
import cv2 as cv
import numpy as np
cat = cv.imread('photo\\cat.jpg', cv.IMREAD_GRAYSCALE)
a = cat
# 用numpy加法
add1 = cat + a
# 用opencv加法
add2 = cv.add(cat, a)
# 显示原图像
cv.imshow('original', cat)
# 用numpy加法的图像
cv.imshow('add1', add1)
# 显示用opencv加法的图像
cv.imshow('add2', add2)
cv.waitKey(0)
cv.destroyAllWindows()
5.3 注意
numpy加法与opencv加法的结果是不同的,但在不同的场景下有不同的应用效果。
6. 图像融合
import cv2 as cv
import numpy as np
a = cv.imread('photo\\1.jpg')
b = cv.imread('photo\\2.jpg')
# 利用cv.addWeighted()函数将两张图融合到一起
result = cv.addWeighted(a, 1, b, 1, -240)
cv.imshow('a', a)
cv.imshow('b', b)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()
7. 图像类型转换
import cv2 as cv
import numpy as np
# 读入BGR图像
a = cv.imread('photo\\cat.jpg')
# 将BGR转为灰度图像
b = cv.cvtColor(a, cv.COLOR_BGR2GRAY)
# 将BGR转为RGB
c = cv.cvtColor(a, cv.COLOR_BGR2RGB)
cv.imshow('cat', a)
cv.imshow('gray', b)
cv.imshow('GRB', c)
cv.waitKey(-1)
cv.destroyAllWindows()
import cv2 as cv
import numpy as np
# 读入灰度图像
a = cv.imread('photo\\gray.jpg', cv.IMREAD_UNCHANGED)
# 灰度转BGR
b = cv.cvtColor(a, cv.COLOR_GRAY2BGR)
print(b.shape)
'(640, 640, 3),有三个通道'
# 显示BGR图像,看起来是灰色的,但它有3个通道
cv.imshow('BGR', b)
cv.waitKey(-1)
cv.destroyAllWindows()
8.图像缩放
必备参数:
src:原始图像
dsize:目标图像大小,格式:(列,行)
fx, fy:这个与dsize二选一
import cv2 as cv
import numpy as np
# 读入原始图像
a = cv.imread('photo\\egg.jpg')
# 提取图像的行列数,通道数
rows, cols, chn = a.shape
# size的书写应先列后行,此处的round是为了让列、行数变为整数
size = (round(cols*0.5), round(rows*1))
# 按照新设定的size对原图像进行绽放
b = cv.resize(a, size)
'''
也可采用以下形式对原图像进行绽放,达到的效果是一样的:行一样,列变为原来的一半
当采用此方法时,将desize设置成None即可
b = cv.resize(a, None, fx=0.5, fy=1)
'''
cv.imshow('a', a)
cv.imshow('b', b)
cv.waitKey(-1)
cv.destroyAllWindows()
9. 图像翻转
参数说明:
src:原始图像
flipCode:选择图像翻转的模式
flilpCode>0:左右
flilpCode=0:上下
flilpCode<0:左右+上下
import cv2 as cv
import numpy as np
# 读入原始图像
a = cv.imread('photo\\egg.jpg', cv.IMREAD_UNCHANGED)
# 做上下翻转
b = cv.flip(a, 1)
# 做左右翻转
c = cv.flip(a, 0)
# 做上下+左右翻转
d = cv.flip(a, -1)
# 显示图像
cv.imshow('a', a)
cv.imshow('b', b)
cv.imshow('c', c)
cv.imshow('d', d)
cv.waitKey(-1)
cv.destroyAllWindows()
10. 阈值分割
10.1 理论介绍
阈值分割有5种情况:
第一张图是原始图像的像素值。
以下图片的纵轴表示点的像素值,横轴的最底下的线表示最小像素值0,最上边的线表示最大像素值255。
第一种情况:二进制阈值化
第二种情况:反二进制阈值化
第三种情况:截断阈值化
第四种情况:反阈值化为0
第五种情况:阈值化为0
10.2 threshold函数
10.2.1 二进制阈值化
10.2.2 反二进制阈值化
<