第二篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像处理

传奇开心果短博文系列

  • 系列短博文目录
    • Python的OpenCV库技术点案例示例短博文系列
  • 博文目录
    • 一、项目目标
    • 二、第一个示例代码
    • 三、第二个示例代码
    • 四、第三个示例代码
    • 五、第四个示例代码
    • 六、第五个示例代码
    • 七、知识点归纳总结

系列短博文目录

Python的OpenCV库技术点案例示例短博文系列

博文目录

一、项目目标

在这里插入图片描述OpenCV图像处理:包括图像滤波、边缘检测、图像变换、颜色空间转换等功能,写示例代码。

二、第一个示例代码

图像滤波
边缘检测
图像变换
颜色空间转换

import cv2
import numpy as np# 读取图像
img = cv2.imread('input.jpg')# 图像滤波
blur = cv2.GaussianBlur(img, (5, 5), 0)# 边缘检测
edges = cv2.Canny(img, 100, 200)# 图像变换
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)
dst = cv2.warpAffine(img, M, (cols, rows))# 颜色空间转换
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Blurred', blur)
cv2.imshow('Edges', edges)
cv2.imshow('Transformed', dst)
cv2.imshow('HSV', hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、第二个示例代码

灰度图像
在这里插入图片描述
膨胀和腐蚀
透视变换
转换为LAB颜色空间

import cv2
import numpy as np# 读取图像
img = cv2.imread('input.jpg')# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 膨胀和腐蚀
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(thresh, kernel, iterations=1)
erosion = cv2.erode(thresh, kernel, iterations=1)# 透视变换
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
perspective = cv2.warpPerspective(img,M,(300,300))# 转换为LAB颜色空间
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Gray', gray)
cv2.imshow('Thresh', thresh)
cv2.imshow('Dilation', dilation)
cv2.imshow('Erosion', erosion)
cv2.imshow('Perspective', perspective)
cv2.imshow('LAB', lab)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、第三个示例代码

图像缩放
旋转图像
图像平移
图像融合

import cv2
import numpy as np# 读取图像
img = cv2.imread('input.jpg')# 图像缩放
resized = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)# 旋转图像
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)
rotated = cv2.warpAffine(img, M, (cols, rows))# 图像平移
M = np.float32([[1, 0, 100], [0, 1, 50]])
translated = cv2.warpAffine(img, M, (cols, rows))# 图像融合
img2 = cv2.imread('input2.jpg')
blended = cv2.addWeighted(img, 0.7, img2, 0.3, 0)# 显示结果
cv2.imshow('Resized', resized)
cv2.imshow('Rotated', rotated)
cv2.imshow('Translated', translated)
cv2.imshow('Blended', blended)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、第四个示例代码

边缘保留滤波
在这里插入图片描述在这里插入图片描述在这里插入图片描述

import cv2
import numpy as np# 读取图像
img = cv2.imread('input.jpg')# 边缘保留滤波
dst = cv2.edgePreservingFilter(img, flags=1, sigma_s=60, sigma_r=0.4)# 图像修复
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
inpainted = cv2.inpaint(img, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)# 角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, maxCorners=25, qualityLevel=0.01, minDistance=10)# 标记角点
for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 5, (0, 0, 255), -1)# 显示结果
cv2.imshow('Edge Preserving Filter', dst)
cv2.imshow('Inpainted', inpainted)
cv2.imshow('Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、第五个示例代码

图像金字塔
角点检测与追踪
创建随机颜色
光流追踪

import cv2
import numpy as np# 读取图像
img = cv2.imread('input.jpg')# 图像金字塔
lower_reso = cv2.pyrDown(img)
higher_reso = cv2.pyrUp(img)# 角点检测与追踪
feature_params = dict( maxCorners = 100, qualityLevel = 0.3, minDistance = 7, blockSize = 7 )
lk_params = dict( winSize  = (15,15), maxLevel = 2, criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
p0 = cv2.goodFeaturesToTrack(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), mask = None, **feature_params)
old_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建随机颜色
color = np.random.randint(0,255,(100,3))# 光流追踪
mask = np.zeros_like(img)
while True:ret, frame = cap.read()frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)good_new = p1[st==1]good_old = p0[st==1]for i,(new,old) in enumerate(zip(good_new,good_old)):a,b = new.ravel()c,d = old.ravel()mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)img = cv2.add(frame,mask)cv2.imshow('frame',img)k = cv2.waitKey(30) & 0xffif k == 27:breakold_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)# 关闭摄像头
cap.release()
cv2.destroyAllWindows()

七、知识点归纳总结

在上面的代码示例中,我们涉及了许多计算机视觉的常见操作和技术。以下是这些知识点的归纳总结:

在这里插入图片描述1. 读取和显示图像:使用OpenCV库的cv2.imread()cv2.imshow()函数读取和显示图像。

  1. 图像缩放:使用cv2.resize()函数对图像进行缩放操作。

  2. 图像旋转:使用cv2.getRotationMatrix2D()cv2.warpAffine()函数对图像进行旋转操作。

  3. 图像平移:使用cv2.warpAffine()函数对图像进行平移操作。

  4. 图像融合:使用cv2.addWeighted()函数对两幅图像进行融合操作。

  5. 边缘保留滤波:使用cv2.edgePreservingFilter()函数进行边缘保留滤波操作。

  6. 图像修复:使用cv2.inpaint()函数对图像进行修复操作。

  7. 角点检测与追踪:使用cv2.goodFeaturesToTrack()和光流法进行角点检测和追踪操作。

  8. 图像金字塔:使用cv2.pyrDown()cv2.pyrUp()函数进行图像金字塔操作。

在这里插入图片描述以上这些知识点涵盖了计算机视觉中的许多常见操作和技术,可以帮助我们对图像进行处理、分析和理解。这些技术在许多领域都有广泛的应用,包括图像处理、计算机视觉、机器学习等。希望这些知识点的归纳总结对您有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPENGL光线追踪

纪念一下运行出了光线追踪代码,用了glfw和glad。 光线的数学表达式 一条光线实际上只是一个起点和一个传播方向,因此光线表达式为: p(t) e t (s-e) 光线与球相交 已知球体的隐式方程为: 把光线 p(t) e t d 代入上述方程,得…

基于SpringBoot Vue医院门诊管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

火箭系统中的多个方面

Python作为一种编程语言,可以应用于无人火箭系统中的多个方面。以下是Python在无人火箭系统发射过程中的重要性: 系统控制:Python可以用于编写无人火箭系统的控制算法和逻辑,实现对火箭的飞行姿态、引擎推力和航向的控制。Python具…

RPC和HTTP,它们之间到底啥关系

既然有 HTTP 请求,为什么还要用 RPC 调用? gPRC 为什么使用 HTTP/2 Spring Cloud 默认是微服务通过Restful API来进行互相调用各自微服务的方法,同时也支持集成第三方RPC框架(这里的说的RPC是特指在一个应用中调用另一个应用的接…

Git--基本操作介绍(2)

Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull. 说明: workspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository&#xf…

Linux 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

2008年苏州大学837复试机试C/C++

2008年苏州大学复试机试 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0,X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充:个人觉得这个题目回忆…

Vscode 顶部Menu(菜单)栏消失如何恢复

Vscode 顶部Menu(菜单)栏消失如何恢复? 首先按一下 Alt按键,看一下是否恢复了菜单栏如果恢复了想了解更进一步的设置,或是没能恢复菜单栏,可以看后续。 1.首先点击左下角 齿轮,打开settings; 或者 直接 ctrl 逗号 …

chrome提升搜索效率的快捷方法

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【计算机二级考试C语言】C预处理器

C 预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor&#x…

C# 使用System.Threading.Timer 实现计时器

写在前面 以往一般都是用 System.Timers.Timer 来做计时器,而 System.Threading.Timer 也可以实现计时器功能,并且还可以配置首次执行间隔,在功能上比System.Timers.Timer更加丰富;根据这个特性就可以实现按指定时间间隔对委托进…

单点安装3.6.23_ubuntu18.04

系统参数配置 操作系统主机命名 hostnamectl set-hostname dbatest01 /etc/hosts配置 cp /etc/hosts /etc/hosts.bak cat >>/etc/hosts<<EOF 10.0.0.31 dbatest01 EOF limits.conf echo add by mongodb >> /etc/security/limits.conf echo m…

掌握C++20的革命性特性:Concepts

掌握C20的革命性特性&#xff1a;Concepts C20 的新特性 C20 引入了 Concepts&#xff0c;这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词&#xff0c;用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编…

书法家深入社区开展“迎春送福”写春联活动

春节将至&#xff0c;岁寒情深。2024年1月22日&#xff0c;在春节即将来临之际&#xff0c;双岗街道万小店社区邀请“四知书画院”院长杨东初、“东方诗书画院”院长杨玉能、“林散之草圣书画院”客座教授倪萍等知名书法家&#xff0c;在合肥市庐阳区为民社会服务中心开展“迎春…

vue2中将axios库挂载到Vue的原型对象上,以使其在整个Vue应用程序中可用

通过Vue.prototype可以扩展Vue的原型对象&#xff0c;并添加自定义的属性或方法。在这种情况下&#xff0c;$axios是自定义的属性名&#xff0c;可以根据需求进行命名。 通过Vue.prototype.$axios axios这行代码&#xff0c;将axios库赋值给Vue的原型对象上的$axios属性。这样…

alzet渗透泵多少钱,你知道么?

alzet渗透压泵可被埋植在实验动物的皮下或腹腔&#xff0c;渗透层与泵体埋植组织之间高渗透压导致组织内水分通过泵体外层的刚性半透膜进入泵体&#xff0c;从而挤压由柔韧的非渗透性膜组成的药池使药池内的试剂以预定的速度释放。 近几年&#xff0c;在研究中使用alzet渗透泵…

Feign代理目标方法执行流程

总体而言Feign调用目标方法之前被jdk动态代理区分为两种形式&#xff1a;负载均衡方式以及域名直接调用方式。 public class FeignClientFactoryBean{public <T> T getTarget() {//通过父容器创建子容器工厂类FeignContextFeignContext context applicationContext.get…

[Oracle] INSERT INTO 几种用法

插入数据需要使用 INSERT INTO 语句。该语句有多种写法&#xff0c;具体取决于插入的数据来源和目标&#xff0c;下面介绍一些常见用法和语法。 1.插入所有列的值 如果要将数据插入到表中的所有列中&#xff0c;则可以使用以下 INSERT INTO 语句&#xff1a; INSERT INTO tab…

ARM_Linux中GCC编译器的使用

目录 前言: GCC编译过程: 预处理&#xff1a; 编译阶段&#xff1a; 汇编&#xff1a; 链接阶段 GCC的常见使用 前言: 什么是GCC: gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Co…

PgSQL - 17新特性 - 块级别增量备份

PgSQL - 17新特性 - 块级别增量备份 PgSQL可通过pg_basebackup进行全量备份。在构建复制关系时&#xff0c;创建备机时需要通过pg_basebackup全量拉取一个备份&#xff0c;形成一个mirror。但很多场景下&#xff0c;我们往往不需要进行全量备份/恢复&#xff0c;数据量特别大的…