【opencv】图像处理(一)

news2024/11/24 18:27:32

实验环境:anaconda、jupyter notebook

实验用到的包:numpy,matplotlib,opencv

一、opencv安装

最好使用python3.6(我之前用的3.9安装opencv3.4.1.15会失败)

conda create -n cv python=3.6

安装opencv3.4.1.15(3.4.2版本开始有些算法就有专利了)

pip install opencv-python==3.4.1.15
pip install opencv-contrib-python==3.4.1.15

进入python命令行

import cv2
cv2.__version__

如果没报错那就可以了,如果出现了如下报错

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

需要再安装

pip install opencv-python-headless==3.4.1.15

二、本文使用到的图片

图片放在python脚本相同目录下(不介意需要调整目录的话,放哪里都无所谓)

三、引入包

import cv2
import matplotlib.pyplot as plt
import numpy as np

四、opencv基础操作

读入图片

img = cv2.imread('cat.jpg')

灰度图形式读入

img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)

显示图片

如果你使用的是jupyer notebook,使用cv2.imshow()会导致内核崩溃

cv2.imshow(img')

使用matplotlib显示图片

# opencv是BGR表示
plt.subplot(121)
plt.imshow(img)
plt.title('cv cat')
# 转为RGB表示
plt.subplot(122)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('plt cat')
plt.show()

opencv图片显示.png

截取部分图片

img = cv2.imread('cat.jpg')
cat = img[0:500,0:1000]
plt.imshow(cv2.cvtColor(cat, cv2.COLOR_BGR2RGB))
plt.title('roi cat')
plt.show()

opencv截取.png

边界填充

img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)

top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
replicate = cv2.copyMakeBorder(img,top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT)
reflect_101 = cv2.copyMakeBorder(img,top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT, value=0)

plt.figure(figsize=(20,10))

plt.subplot(231)
plt.imshow(img,'gray')
plt.title('ORIGINAL')

plt.subplot(232)
plt.imshow(replicate,'gray')
plt.title('REPLICATE')

plt.subplot(233)
plt.imshow(reflect,'gray')
plt.title('REFLCET')

plt.subplot(234)
plt.imshow(reflect_101,'gray')
plt.title('REFLECT_101')

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

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

plt.show()

opencv边界填充.png

图像融合

cat = cv2.imread('cat.jpg')
dog = cv2.imread('dog.jpg')

# 0.4 * cat + 0.6 * dog + 0
img = cv2.addWeighted(cat,0.4 ,dog, 0.6, 0)

plt.subplot(313)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('fusion')
plt.show()

opencv图像融合.png

五、opencv图像阈值处理

阈值处理

阈值处理函数如下:

res,dst = cv3.threshold(src, thresh, maxval, type)
  • src:输入图像
  • dst:输出图像
  • thresh:阈值
  • maxval:像素超出阈值的赋值
  • type:操作类型

常用操作类型

  1. cv2.THRESH_BINARY:超过阈值部分取maxval,其它为0
  2. cv2.THRESHBINARYINV
  3. cv2.THRESH_TRUNC:大于阈值部分取设为阈值,其他不变
  4. cv2.THRESH_TOZERO:大于阈值部分不变,其它为0
  5. cv2.THRESHTOZEROINV
img_gray = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
ret, thresh1 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)

titles = ['orginal','binary','binary inv', 'trunc', 'tozero', 'tozero inv']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2,3, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

opencv阈值处理.png

图像平滑处理

均值滤波

noise = cv2.imread('noise.jpg')

# 均值滤波
# 相加取平均
blur = cv2.blur(noise, (3,3))

plt.figure(figsize=(20,25))
plt.subplot(121)
plt.imshow(cv2.cvtColor(noise, cv2.COLOR_BGR2RGB))

plt.subplot(122)
plt.imshow(cv2.cvtColor(blur, cv2.COLOR_BGR2RGB))
plt.show()

opencv均值滤波.png

方框滤波

带归一化的方框滤波与均值滤波相同

# 方框滤波,带归一化跟均值滤波一样
box = cv2.boxFilter(noise, -1, (3,3), normalize=True)

plt.figure(figsize=(20,25))
plt.subplot(121)
plt.imshow(cv2.cvtColor(noise, cv2.COLOR_BGR2RGB))

plt.subplot(122)
plt.imshow(cv2.cvtColor(box, cv2.COLOR_BGR2RGB))
plt.show()

opencv归一化方框滤波.png

不带归一化的方框滤波容易出现越界情况

# 方框滤波,无归一化(不做平均),容易越界
box = cv2.boxFilter(noise, -1, (3,3), normalize=False)

plt.figure(figsize=(20,25))
plt.subplot(121)
plt.imshow(cv2.cvtColor(noise, cv2.COLOR_BGR2RGB))

plt.subplot(122)
plt.imshow(cv2.cvtColor(box, cv2.COLOR_BGR2RGB))
plt.show()

opencv无归一化方框滤波.png

高斯滤波

# 高斯滤波
# 根据每个点像素值与中心点像素值的差距添加一个权重
gaussian = cv2.GaussianBlur(noise,(5,5),1)

plt.figure(figsize=(20,25))
plt.subplot(121)
plt.imshow(cv2.cvtColor(noise, cv2.COLOR_BGR2RGB))

plt.subplot(122)
plt.imshow(cv2.cvtColor(gaussian, cv2.COLOR_BGR2RGB))
plt.show()

opencv高斯滤波.png

中值滤波

# 中值滤波
# 用指定区域内的中间值替代区域内的像素值
# 5和(5,5)是一样的
median = cv2.medianBlur(noise,5)

plt.figure(figsize=(20,25))
plt.subplot(121)
plt.imshow(cv2.cvtColor(noise, cv2.COLOR_BGR2RGB))

plt.subplot(122)
plt.imshow(cv2.cvtColor(median, cv2.COLOR_BGR2RGB))
plt.show()

opencv中值滤波.png

六、opencv形态学

原始图片

img = cv2.imread('cangying.jpg')

plt.imshow(img)
plt.show()

cangying.jpg

腐蚀操作

腐蚀操作会用黑色覆盖小面积的白色区域

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)

plt.imshow(erosion)
plt.show()

可以发现小毛刺被去除了,但是笔画也变细了

opencv腐蚀操作.png

膨胀操作

膨胀操作会扩大二值图像的白色区域

dilate = cv2.dilate(erosion, kernel, iterations=1)

plt.imshow(dilate)
plt.show()

opencv膨胀操作.png

开运算

先腐蚀,后膨胀

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN,kernel)

plt.figure(figsize=(20,15))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(opening)
plt.show()

opencv开运算.png

闭运算

先膨胀,再腐蚀

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE,kernel)

plt.figure(figsize=(20,15))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(closing)
plt.show()

opencv闭运算.png

梯度运算

膨胀结果-腐蚀结果

可以得到一个空心的结果

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

plt.imshow(gradient)
plt.show()

opencv梯度运算.png

礼帽运算

原图片 - 开运算结果

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

plt.imshow(tophat)
plt.show()

opencv礼帽运算.png

黑帽运算

闭运算结果 - 原始图片

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

plt.imshow(blackhat)
plt.show()

opencv黑帽运算.png

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

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

相关文章

[C语言知识]return和exit到底有什么区别?

前言 💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到C语言知识系列 用通俗易懂的语言让编程语言不再困难 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

windows版本达梦数据复制软件 DMDRS安装

安装步骤: 1: 2:注意安装提醒 3:接受 4:选择安装路径,注意权限以及所需空间大小 5:观察支持的数据源类型

2024审计师报名流程图解❗报名时间汇总❗

2024年审计专业技术资格考试报名正在进行中 🔍审计报名流程 一、考生注册 打开浏览器登录中国人事考试网进行【考生注册】,按照提示认真填写个人注册信息,确保个人信息真实、完整、准确,并上传已处理好的照片。 二、考生报名 1⃣考…

计算机毕业设计springboot体育馆场地预约管理系统【附源码】

计算机毕业设计springboot体育馆场地预约管理系统[附源码] 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制…

ue5地编模块学习记录

ue5网站功能3d溜溜网下载模型https://anyconv.com/max-to-fbx-converter/3dmax转换fbx模型解决问题记录 一、光源 搜索光源搜索不到的时候可以点击 窗口> 对场景内的光照进行处理 二、认识节点 在UE5中,Depth Fade节点通常用于在材质中实现深度淡化效果&#…

element ui输入框后面带输入的字符数量

使用el-input的属性&#xff1a; maxlength&#xff1a;最长字符限制&#xff1b; show-word-limit&#xff1a;显示输入字符数量&#xff1b; 例&#xff1a; <el-input v-model"title" placeholder"请输入名称" maxlength"200" show-wor…

kafka 图形化

介绍 idea 中的一个插件 kafkalytic,kafka 图形化 简单又强大 安装 使用界面 总体信息 数据查看

基于Java的qq截图工具参考论文(论文 + 源码)

【免费】基于Java的qq截图工具.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89304179 基于Java的qq截图工具 摘要 当今时代是飞速发展的信息时代&#xff0c;人们在对信息的处理中对图像的处理量与日俱增&#xff0c;这一点在文档人员上显得非常突出。 本软…

【KMP算法最详细讲解】28. 实现 strStr()

实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack "hello", needle "ll" 输出: 2 示…

《三》菜单栏_工具栏_状态栏动作与实现

上期我们创建了辣么多的动作&#xff0c;那么这次我们要是开始实现这些动作&#xff0c;撸起袖子来吧&#xff1a; //菜单动作&#xff08;ACtion&#xff09;QAction *newAct;//新建QAction *openAct;//打开QAction *saveAct;//保存QAction *saveAsAct;//另存为QAction *prin…

高铁列车班组信息宣传投稿我喜欢上了这个好方法

作为高铁列车班组的一名工作人员,我肩负着对外信息宣传的重任。随着高铁列车的快速发展,我们班组不仅需要提供优质的服务,还需要通过媒体向外界传递我们的声音,展示我们的风采。然而,在投稿的过程中,我经历了一段充满挑战和困惑的时光。 起初,我采用传统的邮箱投稿方式,将精心撰…

TS的快速入门(HarmonyOS学习第一课)

快速入门 学习TypeScript 对于Harmony0s,应用开发至关重要。在Harmonyos 中&#xff0c;主力编程语言为 ArKTS&#xff0c;它是基于 TypeScript 的一种语言&#xff0c;其通过与ArkUI 框架的匹配&#xff0c;拓展了声明式UI和状态管理等能力&#xff0c;使开发者能够以更简洁自…

BMS-HiL系统方案设计

系统集成了业内著名 NI 公司的软硬件平台。 系统设计采用分布式设计模式。主控上位机作为整个实验的管理者主要设计软件交互和 流程管理的业务&#xff1b;下位机主要业务为序列执行与设备调用&#xff0c;各模块详细测试方案如下所示。 系统搭建使用 PXI 系统技术&#xff0c;…

【命名空间】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 学校的人事部门保存了有关学生的部分数据&#xff08;学号、姓名、年龄、住址&#xff09;&#xff0c;教务部门也保存了学生的另外一些部分数据&#xff08;学号、姓名、性别、成绩&#xff09;&#xff0c;两个部门分别编写了本部门的数据管…

OS复习笔记ch5-4-2

引言 承接上文我们介绍了信号量机制和应用信号量机制实现的进程同步和互斥&#xff0c;这一节我们将围绕一些经典问题对信号量机制展开更深入地探讨。 读者/写者问题 读者/写者问题与我们之前遇到的问题类型不同&#xff0c;它描述的是&#xff1a; 有读者和写者两组进程&am…

分布式版本控制工具git

1 安装Git 在linux上我们建议你用二进制的方式来安装git&#xff0c;可以使用发行版包含的基础软件包管理工具来安装&#xff0c;如果你是 是CentOS或者Fedora的操作系统&#xff0c;可以使用yum命令来安装git&#xff1a; $ sudo yum install git如果你是ubuntu或者是Debian…

语音识别-paddlespeech-流程梳理

上一次研究语音识别是21年年底的事情了&#xff0c;记得当时是先进行了语音识别的应用&#xff0c;然后操作了模型的再次训练&#xff1b;两年过去&#xff0c;关于ASR相关流程忘得差不多了&#xff0c;这次基于paddlespeech的代码&#xff0c;进行了流程的梳理&#xff0c;关于…

从零创建一个vue2项目

标题从零创建一个vue2项目&#xff0c;项目中使用TensorFlow.js识别手写文字 npm切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org安装vue/cli -g npm install -g vue/cli检查是否安装成功 vue -V创建项目 vue create 项目名安装TensorFlow npm …

AI试衣IDM-VTON,Windows11本地安装配置记录!

昨天我们已经介绍过IDM-VTON这个开源项目了。 通过这个软件可以轻松实现一键换衣服。 昨天&#xff0c;简单演示了一下在线使用。 今天&#xff0c;来演示如何安装到本地电脑上&#xff01; 本地配置会有一定的专业性&#xff0c;懂的人可以参考下。 不懂得直接拉到最后&am…

绘制一个单级放大电路原理图过程,保姆级教程

新手在学习pads的使用最好最快的方法就是实际上手去画原理图&#xff0c;画PCB图&#xff0c;在这个过程中&#xff0c;就能够更快速得掌握PADS软件的使用。 本篇就是对于实际画原理图过程的一个记录&#xff0c;手把手教学&#xff0c;如果有纰漏或者有更好的一些技巧&#xf…