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 / gammatable = np.array([((i / 255.0) ** invGamma) * 255for 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)

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

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

相关文章

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

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

【Python】Fastapi swagger-ui.css 、swagger-ui-bundle.js 无法加载,docs无法加载,redocs无法使用

使用fastapi的时候,swagger-ui.css 、swagger-ui-bundle.js、redoc.standalone.js 有时候无法加载(国内环境原因或者是局域网屏蔽),此时就需要自己用魔法下载好对应文件,然后替换到fastapi里面去。 fastapi里面依靠这…

前端编码技巧须知

前端开发中可能会使用到以下软件,它们各自具有不同的作用: 代码编辑器:例如Sublime Text、Atom、Visual Studio Code等,用于编写和编辑HTML、CSS和JavaScript等前端代码。网页浏览器:例如Chrome、Firefox、Safari等&a…

Linux开发工具(含gdb调试教程)

文章目录 Linux开发工具(含gdb调试教程)1、Linux 软件包管理器 yum2、Linux开发工具2.1、Linux编辑器 -- vim的使用2.1.1、vim的基本概念2.1.2、vim的基本操作2.1.3、vim正常模式命令集2.1.4、vim末行模式命令集 2.2、vim简单配置 3、Linux编译器 -- gcc…

美团技术博客即将十周岁啦 | 欢迎分享你跟它的故事

种一棵树最好的时间是十年前,其次是现在。 2013年12月04日, 美团技术博客发布了第一篇技术文章。 时光荏苒,岁月如歌。 美团技术博客即将迎来自己十周岁的生日。 感谢大家的一路相伴。 十年来,美团技术博客累计发布了570多篇技术文…

哈工大近世代数期末复习

近世代数是抽象代数的一个分支,是计算机科学和人工智能大数据的基础. 本文内容有点长,大家可以通过index来跳转到想要看的章节,第十章的总结在我的主页里下载 1.代数系 半群:满足结合律的代数系 交换半群:满足交换律的半群 群:判定方法有两种 method1 有单…

抖音汽车租赁小程序背后的技术挑战与解决方案

随着共享经济的不断发展,抖音上的汽车租赁小程序也逐渐崭露头角。然而,这背后涉及的技术挑战却不容小觑。本文将深入探讨抖音汽车租赁小程序的技术挑战,并提出相应的解决方案。 一、实时位置追踪 汽车租赁小程序的核心在于用户能够实时追踪…

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

VOC数据集和COCO数据集直接的相互转换

VOC数据集格式 get_list.py import os import random import shutil# 设置随机种子 random.seed(1000)# 判断Annotations和JpegImages是否对应 train_precent=0.8 label_path= "../../Annotations" print(os.path.abspath(label_path)) save="../Main" pr…

C++中的map和set的使用

C中的map详解 关联式容器键值对树形结构的关联式容器set的使用1. set的模板参数列表2. set的构造3. set的迭代器4. set的容量5. set修改操作6. set的使用举例 map1. map的简介2. map的模板参数说明3. map的构造4. map的迭代器5. map的容量与元素访问6. map的元素修改 multimap和…

【Java】初识JDBC

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;向阳而生&#xff0c;逐光而行 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f4cb;前言 …

浏览器没收到返回,后端也没报错,php的json_encode问题bug

今天网站遇到个问题&#xff0c;后端返回异常&#xff0c;但是浏览器状态码200&#xff0c;但是看不到结果。经过排查发现&#xff0c;我们在返回结果的时候使用了json_encode返回给前端&#xff0c;结果里面的字符编码异常&#xff0c;导致json_encode异常&#xff0c;但是php…