最近本人在学习OpenCV,简要地记一下笔记,课后温习的同时便于日后查阅。
所用教程是唐宇迪老师的OpenCV教程,个人觉得讲解清晰易懂,附上链接:https://www.bilibili.com/video/BV1tb4y1C7j7?p=5
一、截取图像 当我们使用imread读取一张图片后,返回值是一个多维数组。
如果采用的是3通道BGR读取,那么这个数组会是一个三维的,第一个维度表示纵向的像素点,第二个维度表示横向的像素点,第三个维度表示BGR中的通道。
所以截取的时候直接使用数组切片即可。
1.所需模块与自定义函数
import cv2
import numpy as np
import matplotlib.pyplot as pltdef cv_show(name, mat):
cv2.imshow(name, mat)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.截取
miku = cv2.imread('C://Users//rwhite//Pictures//_20210810092934.jpg', cv2.IMREAD_COLOR)
cv_show('miku', miku)
#截取图片的一部分
cv_show('miku', miku[0:200, 0:200])
#截取图片的某个通道
cv_show('miku', miku[:,:,2])
原图与处理得到的图片如下:
文章图片
3.直接切分通道——split
b, g, r = cv2.split(miku)
cv_show('b', b)
cv_show('g', g)
cv_show('r', r)
处理得到的图片如下:
文章图片
4.合并通道——merge
注意:merge传入的参数是一个元组!
m = cv2.merge((b, g, r))
cv_show('miku', m)
运行即可再次得到原图
二、简单处理图像 1.边界填充——copyMakeBoarder
###函数原型
void copyMakeBorder( const Mat& src, Mat& dst,
int top, int bottom, int left, int right,
int borderType, const Scalar& value=https://www.it610.com/article/Scalar() );
###在python中使用
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)
- src,dst:原图与目标图像
- top,bottom,left,right:分别表示在原图四周扩充边缘的大小
- borderType:扩充边缘的类型,OpenCV中给出以下几种方式
- value:若指定为常量填充,则需要设置常量填充的值
cv2.BORDER_REPLICATE |
aaaaaa|abcdefgh|hhhhhhh | 复制粘贴边缘像素 |
cv2.BORDER_REFLECT | fedcba|abcdefgh|hgfedcb | 镜像复制【包括边缘点】 |
cv2.BORDER_REFLECT_101 | gfedcb|abcdefgh|gfedcba | 镜像复制【不包括边缘点】 |
cv2.BORDER_WRAP | cdefgh|abcdefgh|abcdefg | 外包装法 |
cv2.BORDER_CONSTANT | iiiiii|abcdefgh|iiiiiii | 常量复制 |
- 直接与常数相加或者数组的值直接相加
###数组的值直接相加
mikuu = miku + 10
mikuuu1 = miku + mikuucv_show('mikuu', mikuu)
cv_show('mikuuu1', mikuuu1)
文章图片
- 使用函数cv2.add
mikuuu2 = cv2.add(mikuu, mikuuu1)cv_show('mikuuu2', mikuuu1)
文章图片
两者的区别:因为像素点的取值在0-255之间,如果用数组的值直接相加,每个像素点的结果都会自动对256取余。而如果使用函数add相加,则值超过255的像素点将会保留255
3.图像融合
图像融合前,需保证两张图片的大小一致,这就涉及一个缩放的操作
- 缩放图片
###在python中使用
cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)
InputArray src | 输入图片 |
OutputArray dst | 输出图片 |
Size | 输出图片尺寸 |
fx, fy | 沿x轴,y轴的缩放系数 |
interpolation | 【python|Opencv学习笔记二——基本图像操作】插入方式 |
插入方式具体参数如下:
INTER_NEAREST |
最近邻插值 |
INTER_LINEAR |
双线性插值(默认设置) |
INTER_AREA |
使用像素区域关系进行重采样。(在缩小时使用) |
INTER_CUBIC |
4x4像素邻域的双三次插值 |
INTER_LANCZOS4 |
8x8像素邻域的Lanczos插值 |
- 融合
###函数原型
void cv::addWeighted ( InputArraysrc1,
doublealpha,
InputArraysrc2,
doublebeta,
doublegamma,
OutputArraydst,
intdtype = -1
)
###在python中使用
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype)
该函数可用一个公式表示:
dst = src1 * alpha + src2 * beta + gamma注意:alpha和beta表示两幅图像各自的权重,权重越高像素点的值越大,也就越明亮
miku = cv2.imread('C://Users//rwhite//Pictures//_20210810092934.jpg', cv2.IMREAD_COLOR)
rin = cv2.imread('C://Users//rwhite//Pictures//_20210810092925.jpg', cv2.IMREAD_COLOR)cv_show('miku', miku)
cv_show('rin', rin)res = cv2.addWeighted(miku, 0.6, rin, 0.4, 2)
cv_show('res', res)
文章图片
3.图像阈值——threshold
###函数原型
double cv::threshold( InputArraysrc,
OutputArraydst,
doublethresh,
doublemaxval,
inttype
)
###在python中使用
retval, dst = cv2.threshold( src, thresh, maxval, type, dst )
src | 待处理的图像 |
dst | 处理后的图像,大小、类型要与src一致 |
thresh | 门槛值 |
maxval | 最大值【在设置THRESH_BINARY和THRESH_BINARY_INV 时使用】 |
type | 图像处理方式 |
cv2.THRESH_BINARY | 超过阈值部分取maxval(最大值),否则取0 |
cv2.THRESH_BINARY_INV | THRESH_BINARY的反转 |
cv2.THRESH_TRUNC | 大于阈值部分设为阈值,否则不变 |
cv2.THRESH_TOZERO | 大于阈值部分不改变,否则设为0 |
cv2.THRESH_TOZERO_INV | THRESH_TOZERO的反转 |
img = cv2.imread('C://Users//rwhite//Pictures//opencv//_20210511202744.jpg', cv2.IMREAD_COLOR)ret, img1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, img2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
ret, img3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
ret, img4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
ret, img5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)title = ['ORIGINAL', 'THRESH_BINARY', 'THRESH_BINARY_INV', 'THRESH_TRUNC', 'THRESH_TOZERO', 'THRESH_TOZERO_INV']
imgg = [img, img1, img2, img3, img4, img5]for i in range(6):
plt.subplot(2,3,i+1), plt.imshow(imgg[i])
plt.title(title[i])
plt.xticks([]),plt.yticks([])plt.show()
文章图片
推荐阅读
- 人群接触网络中的SIR疫情模拟——Python实现
- python|Opencv项目实战-信用卡数字识别
- python|基于OpenCV实战(动态物体检测)
- #|opencv实战——机器视觉检测和计数
- Opencv项目实战|Opencv项目实战(04 全景图片拼接)
- Python代码|Python 加减计算闯关小游戏
- Python|Python和PHP有什么区别
- python|2022最全的 App 应 用 测 试 技 巧
- 计算机智能算法|计算机智能专题-遗传算法(1不带约束的)