opencv 常用操作指南

1.通道交换

读取图像,然后将RGB通道替换成BGR通道,需要注意的是,opencv读取的图像默认是BGR。cv2.cvtColor函数可以参考Color Space Conversions

img = cv2.imread('imori.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite('answer.png', img)

2.灰度化(Grayscale)

灰度化的计算公式为:

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

3. 二值化(Thresholding)

将大于阈值的像素值令为255,否则令为0。cv2.threshold函数可以参考Miscellaneous Image Transformations

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, img = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)

4. 大津二值化算法(Otsu's Method)

大津算法是一种可以自动确定二值化中阈值的算法。https://docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html 该页面的"Otsu's Binarization"章节

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

5. HSV变换

将使用HSV表示的图像的色相反转。需要注意的是色相(Hue)将颜色从0°到360°表示。HSV颜色模型可以参考https://baike.baidu.com/item/HSV/547122

img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 进行色相反转
img[:, :, 0] = (img[:, :, 0] + 180) % 360
img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR)

6. 减色处理

将图像的值由 2563 压缩至 43 ,即RGB的值只取{32,96,169,224}

img = img // 64 * 64 + 32

7. 平均池化(Average Pooling)

将图像按照固定大小网格分割,网格内的像素值取网格内所有像素的平均值。关于池化的操作似乎在opencv中没找到,只找到了在skimage中的实现 https://stackoverflow.com/questions/42463172/how-to-perform-max-mean-pooling-on-a-2d-array-using-numpy

img = skimage.measure.block_reduce(img, (8, 8, 1), np.mean)

8. 最大池化(Max Pooling)

与平均池化类似

img = skimage.measure.block_reduce(img, (8, 8, 1), np.max)

9. 高斯滤波(Gaussian Filter)

使用高斯滤波器( 3×3 大小,标准差 �=1.3 )进行降噪处理。高斯滤波器将中心像素按照高斯分布加权平均进行平滑化。cv2.GaussianBlur函数可以参考OpenCV: Image Filtering。标准差 �=1.3 的8-紧邻高斯滤波器为:

img = cv2.GaussianBlur(img, (3, 3), 1.3)

10. 中值滤波(Median Filter)

使用中值滤波器( 3×3 大小)进行降噪处理。cv2.medianBlur函数可以参考OpenCV: Image Filtering

img = cv2.medianBlur(img, 3)

11. 均值滤波器

使用均值滤波器( 3×3 大小)进行降噪处理。cv2.blur函数可以参考OpenCV: Image Filtering

img = cv2.blur(img, (3, 3))

12. Motion Filter

motion滤波好像并没有直接可以调用,因此先定义一个卷积核kernel,再利用cv2.filter2D进行卷积。cv2.filter2D可以参考https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga27c049795ce870216ddfb366086b5a04

# 生成一个对角线方向的卷积核(kernel)
kernel = np.diag([1]*3) / 3
img = cv2.filter2D(img, -1, kernel)

motion滤波的效果可以参考https://docs.gimp.org/2.8/en/plug-in-mblur.html

13. MAX-MIN滤波器

MAX-MIN滤波器使用网格内像素的最大值和最小值的差值对网格内像素重新赋值。通常用于边缘检测。

erode和dilate都是形态学操作,分别相当于min滤波和max滤波,erode可以参考https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaeb1e0c1033e3f6b891a25d0511362aeb dilate可以参考https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga4ff0f3318642c4f469d0e11f242f3b6c

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3))
img_max = cv2.dilate(img, kernel)
img_min = cv2.erode(img, kernel)
img = img_max - img_min

14. 差分滤波器(Differential Filter)

差分滤波器对图像亮度急剧变化的边缘有提取效果,可以获得邻接像素的差值。

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel_y = np.array([[0, -1, 0],[0, 1, 0],[0, 0, 0]])
img_y = cv2.filter2D(img, -1, kernel)
kernel_x = np.array([[0, 0, 0],[-1, 1, -0],[0, 0, 0]])
img_x = cv2.filter2D(img, -1, kernel)

15. Sobel滤波器

Sobel滤波器可以提取特定方向(纵向或横向)的边缘。sobel滤波器可以参考OpenCV: Image Filtering。滤波器按下式定义:

纵向:

横向:

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_x = cv2.Sobel(img, cv2.CV_64F, 1, 0)
img_y = cv2.Sobel(img, cv2.CV_64F, 0, 1)

16. Prewitt滤波器

Prewitt滤波器是用于边缘检测的一种滤波器,其函数可以参考https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.prewitt.html

纵向:

横向:

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_x = scipy.ndimage.prewitt(img, 1)
img_y = scipy.ndimage.prewitt(img, 0)

17. Laplacian滤波器

Laplacian滤波器是对图像亮度进行二次微分从而检测边缘的滤波器。https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6

纵向:

横向:

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.Laplacian(img,cv2.CV_64F)

18. Emboss滤波器

Emboss滤波器可以使物体轮廓更加清晰

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]])
img = cv2.filter2D(img, -1, kernel)

19. Log滤波器

LoG即高斯-拉普拉斯(Laplacian of Gaussian)的缩写,使用高斯滤波器使图像平滑化之后再使用拉普拉斯滤波器使图像的轮廓更加清晰。其函数可以参考https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_laplace.html

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = scipy.ndimage.gaussian_laplace(img, sigma=3)

20. 直方图绘制

绘制直方图显示不同数值的像素出现的次数。在 Matplotlib 中有 hist() 函数提供绘制直方图的接口。https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html

img = cv2.imread('imori_dark.jpg').astype(np.float)
plt.hist(img.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.savefig("answer.png")

21. 直方图均衡化

直方图均衡化是一种增强图像对比度的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布。其参考https://stackoverflow.com/questions/31998428/opencv-python-equalizehist-colored-image

img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
# equalize the histogram of the Y channel
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
# convert the YUV image back to RGB format
img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)

22. 伽马校正

伽马校正用来对照相机等电子设备传感器的非线性转换特性进行校正。如果图像鸳鸯显示在显示器上,画面就会显得很暗。伽马校正通过预先增大RGB值来排除显示器的影响,达到对图像修正的目的。其参考https://stackoverflow.com/questions/33322488/how-to-change-image-illumination-in-opencv-python/41061351

def adjust_gamma(image, gamma=1.0):

   invGamma = 1.0 / gamma
   table = np.array([((i / 255.0) ** invGamma) * 255
      for i in np.arange(0, 256)]).astype("uint8")

   return cv2.LUT(image, table)
   
original = cv2.imread('imori_gamma.jpg')
gamma = 2.2                         
adjusted = adjust_gamma(original, gamma=gamma)
cv2.imwrite('answer.png', adjusted)

23. 常见的插值方法

包括双三次、双线性、最邻近插值。

img = cv2.imread('imori.jpg')
height, width = img.shape[:2]
new_height, new_width = int(height/2), int(width/2)
# 双三次
new_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_CUBIC)
# 双线性
new_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
# 最邻近
new_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_NEAREST)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS(五)—— 认识页面和自定义组件生命周期

前言 在前面我们通过如何创建自定义组件一文知道了如何如何自定义组件以及自定义组件的相关注意事项,接下来我们认识一下页面和自定义组件生命周期。 自定义组件和页面的关系 在开始之前,我们先明确自定义组件和页面的关系 自定义组件:Co…

聚观早报 |一加12正式开启预订;OPPO Reno11系列卖点

【聚观365】11月24日消息 一加12正式开启预订 OPPO Reno11系列卖点 小鹏第三季度营收财报 Claude 2.1 聊天机器人公布 现代汽车将与伦敦大学学院合作 一加12正式开启预订 全新的一加12系列公开亮相已有一段时间,不久前一加官方宣布,该机将于12月4日…

(1)(1.19) TeraRanger One/EVO测距仪

文章目录 前言 1 通过I2C与TeraRanger EVO连接 2 Mission Planner中的设置 3 测试传感器 4 参数说明 前言 TeraBee EVO 系列测距仪是基于红外飞行时间 (TOF) 技术的轻型距离测量传感器。与基于激光的激光雷达相比,它们的速度比超声波快得多,体积更…

Microsoft Office 2019下载工具

今天博主继续推出重磅福利——Microsoft Office合集的安装工具。 Microsoft Office是一套由微软公司开发的办公软件,它为 Microsoft Windows 和 Mac OS X而开发。与办公室应用程序一样,它包括联合的服务器和基于互联网的服务。最近版本的 Office 被称为 …

Linux实验三:shell程序设计: shell基础

实验目的: 进一步巩固shell程序设计语言基本语法,加深对所学知识理解。 实验要求 1. 四种变量的使用 2. 配置环境变量 3. 元字符和正则表达式 4. 引号 1. 本地变量 $ var1"hello Linux" //定义本地变量var1 $ read var2 //定义本地变量vae…

React基础入门

文章目录 创建项目组件和事件更新状态导出组件jsx react是目前最流行的前端框架,几乎也不同太介绍了。 创建项目 首先下载node.js,安装成功后,最好换成国内的源 npm config set registry https://registry.npm.taobao.org然后就可以使用脚…

Ubuntu20.04清理垃圾vscode缓存

使用VM虚拟机安装了Ubuntu系统,主目录空间越来越小,硬盘扩容之后很快又空间不足,甚至出现了开机卡黑屏的情况,这里记录一下解决过程。 1 重新开机进入系统 状态:卡到了开机黑屏状态,左上角有一条小横杠 原…

Charles 网络抓包工具详解与实战指南

文章目录 导读软件版本Charles基本原理核心功能下载及安装界面介绍网络包展示 常用场景介绍PC 端网络抓包移动端网络抓包PC 端配置手机端配置 开启 SSL 代理PC 端和移动端 CA 证书安装Charles 直接安装Charles 下载 CA 文件手动安装 常用操作请求重发请求改写、动态改写断点&am…

常用服务注册中心与发现(Eurake、zookeeper、Nacos)笔记(一)基础概念

基础概念 注册中心 在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单,服务…

【100个Cocos实例】东皇太一的技能环绕效果

引言 Cocos中物体围绕物体做圆周运动。 不管是2D还是3D游戏,旋转是游戏中常见的操作之一,它可以用来改变游戏对象的方向、角度或者位置,从而创造出更加生动和有趣的游戏体验。 本文将介绍一下如何实现王者荣耀中东皇太一的技能环绕效果。 …

五分钟,Docker安装flink,并使用flinksql消费kafka数据

1、拉取flink镜像,创建网络 docker pull flink docker network create flink-network2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…

123. 股票买卖的最佳时机III(2次交易)

题目 题解 class Solution:def maxProfit(self, prices: List[int]) -> int:N len(prices)# 状态定义 dp[i][j][k]代表在第i天,被允许完成j次交易时,持有或者不持有的最大利润。k0代表不持有,k1代表持有dp [[[0 for k in range(2)] for…

朋友圈被折叠怎么解决?

最近有客户咨询发的朋友圈老被折叠怎么办,正常发都被折叠。一些朋友在微信做私域的,在朋友圈日常营销是必不可少的,如何避免这种问题和怎么解决呢? 为什么会被折叠? 1.据了解,朋友圈内容折叠功能是主要针对…

【JavaScript】3.1 项目实践:制作一个简单的网页应用

文章目录 项目需求HTML结构JavaScript逻辑添加待办事项标记待办事项删除待办事项保存待办事项 总结 在此章节中,我们将学习如何使用JavaScript创建一个简单的网页应用。这将是一个待办事项列表应用,用户可以添加新的待办事项,标记已完成的事项…

【MySQL】mysql中不推荐使用uuid或者雪花id作为主键的原因以及差异化对比

文章目录 前言什么是UUID?什么是雪花ID?什么是MySql自增ID?优缺点对比UUID:优点1.全球唯一性2.无需数据库支持 缺点1.存储空间大2.索引效率低3.查询效率低 雪花ID:优点1.分布式环境下唯一性 缺点1.依赖于机器时钟2.存储空间较大3.查询效率低 MYSQL自增:优点1.简单…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 小程序商城免费搭建

使用技术: Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台: 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务(30个通用微服务如:商品、订单、购物车、个人中心、支…

c#数据库:vs2022 加入mysql数据源

网上有VS2019连接MySQL数据库的,那么VS2022,VS2023如果和连接到mysql数据库呢,这里总结一下我的经历: 1、首先下载ODBC驱动安装包 当前下载地址:https://dev.mysql.com/downloads/connector/odbc/ 2、ODBC安装 下载完…

qgis添加wms服务

例如添加geoserver的wms服务 左右浏览器-WMS/WMTS-右键-新建连接 URL添加geoserver的wms地址 http://{ip}:{port}/geoserver/{workspace}/wms 展开wms目录,双击相应图层即可打开

Linux - 文件系统 - 理解目录 - 理解 软/硬链接

前言 在上篇博客当中,我们对 文件系统 和 inode 做了初步了解,本博客将在上篇博客的基础之上,对于 文件系统当中的目录进行进步一阐述。 Linux - 进一步理解 文件系统 - inode - 机械硬盘-CSDN博客 目录 一个文件有一个 inode,…

【面试送分题!“商品分类浏览”如何测试?】

电商项目无论是工作中,还是面试中,都是一个高频出现的词。 面试官非常热衷提问关于电商项目的问题。例如商品分类怎么测试?购物车怎么测试?订单怎么测试?优惠券怎么测试?支付怎么测试?等等。 …