首页 > 其他分享 >OpenCV的简单函数

OpenCV的简单函数

时间:2024-12-11 20:03:20浏览次数:6  
标签:函数 img 简单 cv2 像素 OpenCV THRESH 图像 阈值

一、二值化(threshold)

1.二值化图

二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。

2.实现方法,函数

阈值法(THRESH_BINARY)

反阈值法(THRESH_BINARY_INV)

截断阈值法(THRESH_TRUNC):

低阈值零处理(THRESH_TOZERO)

超阈值零处理(THRESH_TOZERO_INV)

OTSU阈值法 

参数:

  • src: 输入图像,这应该是一个灰度图像(即单通道图像)。如果你有一个彩色图像,你需要先使用 cv2.cvtColor() 将其转换为灰度图。
  • thresh: 阈值,用于将像素划分为两部分。这个值是一个浮点数或整数,取决于图像的数据类型。
  • maxVal: 最大值,用于设置高于阈值的像素值。这个值通常是一个整数,表示你想要将高于阈值的像素设置为的具体数值。
  • type: 阈值类型,这是一个标志,用于指定如何应用阈值。OpenCV 提供了几种不同的阈值类型,如 cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO 和 cv2.THRESH_TOZERO_INV。
  • dst: 输出图像,与输入图像具有相同的大小和类型。这是一个可选参数,如果不提供,函数会创建一个新的图像来存储二值化结果。

函数返回值:

  • ret: 实际使用的阈值。在某些情况下(如使用 cv2.THRESH_OTSU 或 cv2.THRESH_TRIANGLE 标志时),这个值可能会与输入的 thresh 不同。
  • dst: 二值化后的图像。
import cv2

img=cv2.imread('./1.png')

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

ret,img_b=cv2.threshold(img_gray,120,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print(ret)

cv2.imshow('img1',img_gray)
cv2.imshow('img',img_b)
cv2.waitKey(0)

二、自适应二值化(adaptiveThreshold)

与二值化算法相比,自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片上的每一小部分都要使用不同的阈值进行二值化处理,这时候传统的二值化算法就无法满足我们的需求了,于是就出现了自适应二值化。

1.取均值(ADAPTIVE_THRESH_MEAN_C)

2.加权求和(ADAPTIVE_THRESH_GAUSSIAN_C)

3.功能:对图像应用自适应阈值处理。

4.参数:

  • src: 输入图像,必须为灰度图像。
  • maxValue: 超过或等于阈值的像素值被赋予的值。它可以是任意数值,但通常设置为 255(表示白色)。
  • adaptiveMethod: 自适应阈值算法的选择。有两种选择:
    • cv2.ADAPTIVE_THRESH_MEAN_C:计算邻域的平均值,然后从平均值中减去常数 C。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:计算邻域像素的加权和(使用高斯窗口),然后从加权和中减去常数 C。
  • thresholdType: 阈值类型,与固定阈值函数 cv2.threshold() 相同。通常是 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV。
  • blockSize: 用于计算阈值的邻域大小(必须是奇数)。
  • C: 从计算出的平均值或加权和中减去的常数。
import cv2

img=cv2.imread('./2.png')

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

img_b=cv2.adaptiveThreshold(
    img_gray,
    244,
    cv2.ADAPTIVE_THRESH_MEAN_C,
    cv2.THRESH_BINARY,
    9,
    5
                                )


cv2.imshow('img',img_b)
cv2.waitKey(0)

 

三、腐蚀(erode,变瘦)

1.定义:

腐蚀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也就是从图像的左上角开始,滑动到图像的右下角)。在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其最小值,该最小值就是卷积核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值图,所以不是黑就是白,这就意味着,在被核值为1覆盖的区域内,只要有黑色(像素值为0),那么该区域的中心像素点必定为黑色(0)。这样做的结果就是会将二值化图像中的白色部分尽可能的压缩,如下图所示,该图经过腐蚀之后,“变瘦”了。

2.功能:用于对图像进行腐蚀操作

3.参数:

  • src: 输入图像,这可以是一个二值图像、灰度图像或彩色图像。对于二值图像,通常使用 0 和 255 表示像素值;对于灰度图像和彩色图像,像素值范围可能更广。
  • kernel: 结构元素,核。
  • dst: 输出图像,是一个可选参数,如果不提供,函数会创建一个新的图像来存储腐蚀结果。
  • anchor: 锚点,这是一个可选参数,通常不需要修改。
  • iterations: 迭代次数,表示腐蚀操作应该应用的次数。默认值为 1,但你可以通过增加这个值来应用多次腐蚀,从而得到更强的效果。
  • borderType: 边界类型,用于指定图像边界的像素外推方法。这通常是一个可选参数,默认值为 cv2.BORDER_DEFAULT,表示使用默认的边界填充方法。
  • borderValue: 边界值,当 borderType 为 cv2.BORDER_CONSTANT 时使用,表示边界像素应该被设置的值。这也是一个可选参数。

函数返回值:

  • dst: 腐蚀后的图像,这是一个包含腐蚀操作结果的 NumPy 数组。
import numpy as np
import cv2

#使用numpy创建结构化元素
ret1=np.ones((5,5),dtype=np.uint8)
print(ret1)

#使用cv2创建结构化元素/核
ret2=cv2.getStructuringElement(cv2.MORPH_ELLIPSE, #指定形状,椭圆
                               (5,5) # 大小
                               )
print(ret2)

#读取一张二值化图
img_b=cv2.imread('./3.png')

#进行腐蚀操作

# 创建结构化元素/核
kernal=cv2.getStructuringElement(cv2.MORPH_RECT, #指定形状,矩形
                               (9,9) # 大小
                               )

# 调用腐蚀函数
img_erode=cv2.erode(img_b,kernal)
cv2.imshow('img',img_erode)
cv2.waitKey(0)

四、膨胀(dilate,变胖) 

1.定义:

膨胀与腐蚀刚好相反,膨胀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也就是从图像的左上角开始,滑动到图像的右下角),在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其最大值,该最大值就是核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值图,所以不是黑就是白,这就意味着,在卷积核覆盖的区域内,只要有白色(像素值为255),那么该区域的中心像素点必定为白色(255)。这样做的结果就是会将二值化图像中的白色部分尽可能的扩张,如下图所示,该图经过腐蚀之后,“变胖”了。

2.功能:对图像进行膨胀操作

3.参数:

  • src: 输入图像,这可以是一个二值图像、灰度图像或彩色图像。
  • kernel: 结构元素,。
  • dst: 输出图像,是一个可选参数,如果不提供,函数会创建一个新的图像来存储膨胀结果。
  • anchor: 锚点。
  • iterations: 迭代次数,表示膨胀操作应该应用的次数。默认值为 1,但可以通过增加这个值来应用多次膨胀,从而得到更强的效果。
  • borderType: 边界类型,用于指定图像边界的像素外推方法。默认值为 cv2.BORDER_DEFAULT。
  • borderValue: 边界值,当 borderType 为 cv2.BORDER_CONSTANT 时使用,表示边界像素应该被设置的值。

函数返回值:

  • dst: 膨胀后的图像,这是一个包含膨胀操作结果的 NumPy 数组。
import cv2

img_b=cv2.imread('./3.png')

#进行膨胀
#获取核结构
kernal=cv2.getStructuringElement(cv2.MORPH_ELLIPSE, #指定形状,矩形
                               (9,9) # 大小


#进行膨胀
img_d=cv2.dilate(img_b,kernal)

cv2.imshow('img',img_d)
cv2.waitKey(0)

 

五、仿射变换(图像进行平移,旋转,缩放,剪切等)

1.cv2.getRotationMatrix2D(center, angle, scale)

功能:用于计算二维旋转矩阵的函数

参数:

center: 旋转的中心点,通常是一个二元元组 (x, y),表示旋转中心的坐标。

angle: 旋转的角度,以度为单位。正值表示逆时针旋转,负值表示顺时针旋转。

scale: 缩放因子。默认情况下,这个值是 1.0,表示不缩放。如果你想要同时旋转和缩放图像,可以通过调整这个参数来实现。

2.cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

功能:用于对图像进行仿射变换(Affine Transformation)的函数,仿射变换包括平移、旋转、缩放以及剪切等操作。

参数:

src: 输入图像。

M: 变换矩阵,一个 2x3 的数组。这个矩阵是通过其他函数(如 cv2.getRotationMatrix2D())计算得到的,用于描述仿射变换。

dsize: 输出图像的大小,以 (width, height) 的形式表示。这个参数决定了变换后图像的尺寸。

dst: 输出图像,与输入图像有相同的大小和类型。这是一个可选参数,如果提供,则变换的结果会存储在这个图像中;如果未提供,则会创建一个新的图像来存储结果。

flags: 插值方法。常用的插值方法包括 cv2.INTER_LINEAR(线性插值)、cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_CUBIC(三次样条插值)等。这是一个可选参数,如果未提供,则默认使用线性插值。

borderMode: 边缘填充方法。常用的方法包括 cv2.BORDER_CONSTANT(常量填充)、cv2.BORDER_REFLECT(反射)、cv2.BORDER_REFLECT_101(反射101)等。这是一个可选参数,如果未提供,则默认使用常量填充。

borderValue: 边界颜色,当 borderMode 为 cv2.BORDER_CONSTANT 时使用。这个参数是一个表示颜色的元组或数组,如 (255, 255, 255) 表示白色。这是一个可选参数,如果未提供,则默认使用黑色 (0, 0, 0)。

import cv2

img=cv2.imread('./2.png')

# 获取变换矩阵-
M=cv2.getRotationMatrix2D(
    (img.shape[1]/2,img.shape[0]/2),45,0.5
    # 旋转的中心点,一般为图片的中心   旋转角度,缩放比例
)

#对图像进行放射变换
img_warp=cv2.warpAffine(
    img, #要旋转的图像
    M,  # 旋转矩阵
    (img.shape[0],img.shape[1]),  #输出图像的大小
    flags=cv2.INTER_LINEAR,         # 插值方式
    borderMode=cv2.BORDER_WRAP      #边缘填充方式,默认是常数填充为黑色
)
cv2.imshow('img',img)
cv2.imshow('img_w',img_warp)
cv2.waitKey(0)

六、透视变换函数

透视变换是把一个图像投影到一个新的视平面的过程,在现实世界中,我们观察到的物体在视觉上会受到透视效果的影响,即远处的物体看起来会比近处的物体小。透视投影是指将三维空间中的物体投影到二维平面上的过程,这个过程会导致物体在图像中出现形变和透视畸变。透视变换可以通过数学模型来校正这种透视畸变,使得图像中的物体看起来更符合我们的直观感受。通俗的讲,透视变换的作用其实就是改变一下图像里的目标物体的被观察的视角。

cv2.getPerspectiveTransform(src, dst)

功能:cv2.getPerspectiveTransform(src, dst)

参数:

src: 源图像中的四个点,通常是一个形状为 (4, 2) 的 numpy 数组或类似的数据结构,表示四个点的坐标。这四个点应该按照某种顺序排列(例如,顺时针或逆时针),因为变换矩阵的计算依赖于这个顺序。

dst: 目标图像中的四个点,与 src 参数类似,也是一个形状为 (4, 2) 的 numpy 数组或类似的数据结构,表示变换后四个点应该位于的位置。

函数返回一个 3x3 的变换矩阵,可以使用 cv2.warpPerspective() 函数将这个矩阵应用于图像,从而执行透视变换。

cv2.warpPerspective(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=None)

功能:用于对图像进行透视变换的函数

参数:

src: 输入图像,即你想要进行透视变换的源图像。

M: 透视变换矩阵,通常是一个 3x3 的矩阵,可以通过 cv2.getPerspectiveTransform() 函数计算得到。这个矩阵定义了源图像中的点如何映射到目标图像中的点。

dsize: 输出图像的尺寸,以 (width, height) 的形式表示。这是变换后图像的尺寸。

dst: 输出图像,这是一个可选参数。

flags: 插值方法。

borderMode: 边界填充方法。

borderValue: 边界颜色【可选】。

import  cv2
import numpy as np

# 1、读取一张图片
img = cv2.imread("./card.png")

# 2、 获取透视变换矩阵
# 原图中的四个点
points1 = np.array([[200, 100], [700, 150], [140, 400], [650, 460]], 
                   dtype=np.float32)
# 目标图中的四个点
points2 = np.array([[0, 0], [img.shape[1], 0], [0, img.shape[0]], [img.shape[1], img.shape[0]]],
                   dtype=np.float32)
M = cv2.getPerspectiveTransform(points1, points2)

# 3、透视变换
img_warp = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))

cv2.imshow('image', img)
cv2.imshow('image_warp', img_warp)
cv2.waitKey(0)

标签:函数,img,简单,cv2,像素,OpenCV,THRESH,图像,阈值
From: https://blog.csdn.net/qq_69220879/article/details/144407868

相关文章

  • 一个简单的整数问题(树状数组区间修改,单点查询)
    给定长度为 NN 的数列 AA,然后输入 MM 行操作指令。第一类指令形如 Clrd,表示把数列中第 l∼rl∼r 个数都加 dd。第二类指令形如 Qx,表示询问数列中第 xx 个数的值。对于每个询问,输出一个整数表示答案。输入格式第一行包含两个整数 NN 和 MM。第二行包含......
  • Golang学习笔记_02——函数
    Golang测试功能应用Golang学习笔记_01——包函数文章目录函数1.定义2.返回值3.命名返回值4.可变参数源码Go语言中的函数是一种基本的编程结构,用于封装一段代码,以便在需要时多次调用。函数可以接收参数并返回结果,是实现代码复用和模块化编程的重要手段。1......
  • 【语法】高阶函数:map、filter、sorted、reduce
    map【python】Python高阶函数--map函数的详细语法分析与应用实战_pythonmap-CSDN博客filter【python】Python高阶函数--filter函数的高阶用法解析与应用实战_python的filter函数的用法-CSDN博客sorted【python】Python高阶函数--sorted函数的高阶用法解析与应用实战_高阶函......
  • 制作一个简单的单片机上的boot系统
    此篇文章在2023年3月24日被记录ARM单片机使用自定义bootloader什么是BOOT懂得计算机的同学都知道,电脑在开机时,从上电的那一刻开始,首先会进入bios,这个bios的作用就类似于单片机中的bootloader。万一我们浏览某些不可言状的网站导致系统崩溃时,我们就可以在这个临时的系统(bios)中......
  • C语言(函数指针与指针函数)
    函数指针定义:函数指针本质上是指针,它是函数的指针(定义了一个指针变量,变量中存储了函数的地址)。函数都有一个入口地址,所谓指向函数的指针,就是指向函数的入口地址。这里函数名就代表入口地址。函数指针存在的意义:让函数多了一种调用方式函数指针作为形参,可以形式调用(回调......
  • 【学习日记】Java创建简单登录功能
    步骤:1、开发登录界面,提示用户通过键盘输入登录名和密码。创建了一个Scanner对象sc,以便后续读取用户在控制台输入的用户名和密码信息。Scannersc=newScanner(System.in);System.out.println("请输入用户名:");Stringusername=sc.next();System.out.pri......
  • RT-DETR改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数
    一、背景现有问题:大多数现有工作假设训练数据中的样本都是高质量的,专注于增强边界框回归损失的拟合能力。然而,在低质量样本上盲目增强边界框回归会损害定位性能。解决思路:本文使用Wise-IoU,其动态非单调FM使用异常值程度而非IoU来评估锚框的质量,并提供一种有效的梯度增益......
  • js逆向学习-1 逆向rsa简单加密
    RSA加密Rsa加密包含一个key和一个mode这个mode默认10001,也可以修改观察发送的数据首先点击登录选择xhr这个筛选模块,可以看到这里面只有这个check的数据请求,然后查看发送的数据,可以看到这里的密码是进行加密的然后记录这些值打断点知道了请求和加密的数据,现在就是去......
  • IT运维实践:东方通V6简单上手高可用搭建
    概述:TongHttpServer是一款高性能的服务代理中间件,支持OSI四层七层协议,可作为静态资源服务器、正向代理服务器、反向代理服务器、负载均衡服务器使用,支持带权轮询、IP哈希、最小连接、随机、哈希等多种负载均衡算法,满足企业构建高可用、高扩展性、高性能的应用服务集群需求。 ......
  • PHP + JS + HTML 实现简单模板设计的视频播放功能
    PHP+JS+HTML实现简单模板设计的视频播放功能引言随着互联网的发展,视频内容已成为网站的重要组成部分。本文将介绍如何使用PHP、JavaScript和HTML实现一个简单的视频播放功能。我们将创建一个基本的模板,允许用户上传视频并在网页上播放。一、项目准备1.1环境搭建......