opencv for python_OpenCV for Python 学习笔记 三

本文介绍了使用OpenCV实现图像的边界添加与多种几何变换的方法,包括缩放、位移、旋转、仿射变换和透视变换等,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给源图像增加边界

cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

src:源图像

top,bottem,left,right: 分别表示四个方向上边界的长度

borderType: 边界的类型

有以下几种:

BORDER_REFLICATE    # 直接用边界的颜色填充, aaaaaa | abcdefg |gggg

BORDER_REFLECT     # 倒映,abcdefg | gfedcbamn |nmabcd

BORDER_REFLECT_101   # 倒映,和上面类似,但在倒映时,会把边界空开,abcdefg | egfedcbamne |nmabcd

BORDER_WRAP      # 额。类似于这种方式abcdf | mmabcdf |mmabcd

BORDER_CONSTANT    # 常量,增加的变量通通为value色 [value][value] | abcdef | [value][value][value]

value: 仅仅是常量型边界才有意义

代码及结果如示:

importnumpy as npimportcv2from matplotlib importpyplot as plt

RED=[255,0,0]

img= cv2.imread('/home/zh/pic/3.png')

img1= cv2.resize(img, (0,0), fx=0.5, fy=0.5)

replicate= cv2.copyMakeBorder(img1, 10,100,100,100, cv2.BORDER_REPLICATE)

reflect= cv2.copyMakeBorder(img1, 100,10,100,100, cv2.BORDER_REFLECT)

reflect101= cv2.copyMakeBorder(img1, 100,100,10,100, cv2.BORDER_REFLECT_101)

wrap= cv2.copyMakeBorder(img1, 100,100,100,10, cv2.BORDER_WRAP)

constant= cv2.copyMakeBorder(img1, 100,100,100,100, cv2.BORDER_CONSTANT, value=RED)

plt.subplot(231),plt.imshow(img1),plt.title('ORIGINAL')

plt.subplot(232),plt.imshow(replicate),plt.title('REFLECT')

plt.subplot(233),plt.imshow(reflect),plt.title('REFLECT')

plt.subplot(234),plt.imshow(reflect101),plt.title('REFLECT_101')

plt.subplot(235),plt.imshow(wrap),plt.title('WRAP')

plt.subplot(236),plt.imshow(constant),plt.title('CONSTANT')

plt.show()

图像的几何变换:

常见的几何变换有缩放,仿射,透视变换,可以通过如下函数完成对图像的上述变换

dst =cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

dst=cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

dst= cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

首先是缩放变换cv2.resize()

非关键字参数组有2个:src,dsize,分别是源图像与缩放后图像的尺寸

关键字参数为dst,fx,fy,interpolation

dst为缩放后的图像,fx,fy为图像x,y方向的缩放比例,

interplolation为缩放时的插值方式,有三种插值方式:

cv2.INTER_AREA   # 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法

cv2.INTER_CUBIC  # 立方插值

cv2.INTER_LINEAR # 双线形插值

cv2.INTER_NN # 最近邻插值

仿射变换cv2.warpAffine()

非关键字参数有src, M, dsize,分别表示源图像,变换矩阵,变换后的图像的长宽

这里说一下放射变换的变换矩阵

位移变换矩阵为:

旋转变换矩阵:

标准旋转变换矩阵为

,但该矩阵没有考虑旋转变换时进行位移以及缩放操作,OpenCV中的旋转变换如下:

,其中

OpenCV中提供了一个函数获得这样一个矩阵

M=cv2.getRotationMatrix2D(rotate_center, degree, scale)

rotate_center为一个2元的元组,表示旋转中心坐标,degree表示逆时针旋转的角度,scale表示缩放的比例

仿射变换矩阵:

透视变换cv2.warpPerspective()

非关键字参数src, M, dsize分别表示源图像,变换矩阵,以及输出图像的大小

关键字参数为flags, borderMode, borderValue,这几个参数的意思理解的还不是很清楚,可以去

http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html 查找warpPerspective函数

透视变换矩阵一般不容易直接知道,能够直接知道的往往是变换前后的点的位置,因此,OpenCV中提供了getPersepectiveTransform()函数获得透视变换矩阵

M = cv2.getPerspectiveTransform(pts1, pts2)

pts1,pts2分别为变换前点的位置以及变换后点的位置

(其实所有的变换的变换矩阵都可以通过变换前后点的坐标得到,即通过上面这个函数,因为所有的变换都是透视变换中的特例而已)

最后用一个实例将上述变换函数作用呈现如下:

importnumpy as npimportcv2from matplotlib importpyplot as plt#scaling:

img = cv2.imread('/home/zh/pic/3.png')

rows, cols, channels=img.shape

res= cv2.resize(img, (cols/2, rows/2))#Translation:

#1.shift

M_shift = np.float32([[1,0,100],[0,1,50]])

img_shift=cv2.warpAffine(img, M_shift, (cols, rows))#2.rotate

M_rotate = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)

img_rotate=cv2.warpAffine(img, M_rotate, (cols, rows))#3.affine

pts1 = np.float32([[50,50],[200,50],[50,200]])

pts2= np.float32([[10,100],[200,50],[100,250]])

M_affine=cv2.getAffineTransform(pts1,pts2)

img_affine=cv2.warpAffine(img, M_affine, (cols, rows))#4.perspective

pts3 = np.float32([[56,65],[368,52],[28,387],[389,390]])

pts4= np.float32([[0,0],[300,0],[0,300],[300,300]])

M_perspective=cv2.getPerspectiveTransform(pts3,pts4)

img_perspective=cv2.warpPerspective(img, M_perspective, (cols, rows))print 'shift:\n', M_shiftprint 'rotate:\n', M_rotateprint 'affine:\n', M_affineprint 'perspective:\n', M_perspective

plt.subplot(231),plt.imshow(img),plt.title('src')

plt.subplot(232),plt.imshow(res),plt.title('scale')

plt.subplot(233),plt.imshow(img_shift),plt.title('shift')

plt.subplot(234),plt.imshow(img_rotate),plt.title('rotate')

plt.subplot(235),plt.imshow(img_affine),plt.title('affine')

plt.subplot(236),plt.imshow(img_perspective),plt.title('perspective')

plt.show()

结果如下:

### 中职学校网络安全理论课程大纲和教学内容 #### 2025年中职学校网络安全理论课程概述 随着信息技术的发展网络安全已成为信息化社会的重要组成部分。为了适应这一需求,中职学校的网络安全理论课程旨在培养学生具备基本的网络安全意识和技术能力,使学生能够在未来的职业生涯中应对各种网络威胁。 #### 教学目标 该课程的目标是让学生理解网络安全的基本概念、原理和技术手段,掌握常见的安全防护措施,并能应用这些知识解决实际问题。具体来说,学生应达到以下几点: - 掌握计算机网络基础架构及其工作原理; - 理解信息安全管理体系框架及其实现方法; - 学习密码学基础知识以及加密算法的应用场景; - 能够识别常见攻击方式并采取有效防御策略; #### 主要章节安排 ##### 第一章 计算机网络与互联网协议 介绍计算机网络的基础结构和服务模型,重点讲解TCP/IP五层体系结构中的各层次功能特点,特别是传输控制协议(TCP)和用户数据报协议(UDP)[^1]。 ##### 第二章 信息系统安全保障概论 探讨信息系统的脆弱性和风险评估机制,阐述如何通过物理隔离、访问控制等措施来保障系统安全性。 ##### 第三章 密码学入门 讲述对称密钥体制和非对称密钥体制的区别与发展历程,分析公钥基础设施(PKI)的工作流程及其重要性。 ##### 第四章 防火墙技术与入侵检测系统(IDS) 解释防火墙的作用原理及其分类形式(包过滤型、代理服务器型),讨论IDS的功能特性及部署建议。 ##### 第五章 Web应用程序安全 针对Web环境下的特殊挑战展开论述,如SQL注入漏洞利用、跨站脚本(XSS)攻击防范等内容。 ##### 实践环节设置 除了上述理论部分外,在每学期还设有专门实践课时用于模拟真实环境中可能遇到的安全事件处理过程,增强学生的动手操作能力和应急响应水平。 ```python # Python代码示例:简单的MD5哈希函数实现 import hashlib def md5_hash(text): hasher = hashlib.md5() hasher.update(text.encode('utf-8')) return hasher.hexdigest() print(md5_hash("example")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值