Opencv库学习笔记

本文详细介绍了OpenCV库在图像处理中的应用,包括图片的读写、格式转换、缩放、灰度处理、边缘检测、通道操作、图像加法、图像融合、图像类型转换、图像缩放、图像翻转、阈值分割、滤波、形态处理、图像梯度、Canny边缘检测、图像金字塔、图像轮廓、直方图绘制、傅里叶变换等。通过实例演示了各种操作的代码和效果,深入浅出地讲解了OpenCV的主要功能。
摘要由CSDN通过智能技术生成

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()

B通道
在这里插入图片描述
在这里插入图片描述

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 反二进制阈值化

在这里插入图片描述<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值