学习日志023---初始opencv

打印 上一主题 下一主题

主题 809|帖子 809|积分 2437

一、二值化

功能

二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图
1.1、阈值法(THRESH_BINARY)
通过设置一个阈值,将灰度图中的每一个像素值与该阈值举行比较,小于即是阈值的像素就被设置为0(黑),大于阈值的像素就被设置为maxval。
1.2、反阈值法(THRESH_BINARY_INV)
与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会酿成0(黑),当灰度图的像素值小于即是阈值时,该像素值将会酿成maxval。
1.3、截断阈值法(THRESH_TRUNC):
指将灰度图中的全部像素与阈值举行比较,像素值大于阈值的部分将会被修改为阈值,小于即是阈值的部分不变。换句话说,经过截断阈值法处理过的二值化图中的最大像素值就是阈值。
1.4、低阈值零处理(THRESH_TOZERO)
就是像素值小于即是阈值的部分被置为0(也就是黑色),大于阈值的部分不变。
1.5、超阈值零处理(THRESH_TOZERO_INV)
就是将灰度图中的每个像素与阈值举行比较,像素值大于阈值的部分置为0(也就是黑色),像素值小于即是阈值的部分不变。
1.6、OTSU阈值法
在介绍OTSU阈值法之前,我们首先要了解一下双峰图片的概念。
双峰图片就是指灰度图的直方图上有两个峰值,直方图就是对灰度图中每个像素值的点的个数的统计图
OTSU算法是通过一个值将这张图分前景色和背景色(也就是灰度图中小于这个值的是一类,大于这个值的是一类),通过统计学方法(最大类间方差)来验证该值的公道性,当根据该值举行分割时,使用最大类间方差盘算得到的值最大时,该值就是二值化算法中所必要的阈值。通常该值是从灰度图中的最小值加1开始举行迭代盘算,直到灰度图中的最大像素值减1,然后把得到的最大类间方差值举行比较,来得到二值化的阈值
参数

  1. @_typing.overload
  2. def threshold(src: cv2.typing.MatLike,
  3. thresh: float,
  4. maxval: float,
  5. type: int, dst: cv2.typing.MatLike | None = ...)
  6. -> tuple[float, cv2.typing.MatLike]: ...
复制代码


  • 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: 二值化后的图像。
应用

  1. import cv2
  2. # 读取图像
  3. img = cv2.imread('./1.png')
  4. # 将图像灰度化
  5. img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  6. # 设置阈值为200 ,最高值为255
  7. thresh = 200
  8. maxval = 255
  9. ret,img_binary = cv2.threshold(img_gray,thresh=thresh,maxval=maxval,type=cv2.THRESH_OTSU)# 设置用otsu
  10. # 展示成果
  11. # 原图
  12. cv2.imshow("img",img)
  13. # 灰度图
  14. cv2.imshow("img_gray",img_gray)
  15. # 二值图
  16. cv2.imshow("img_binary",img_binary)
  17. # 阻塞
  18. cv2.waitKey(0)
复制代码


二、自适应二值化

功能

与二值化算法相比,自适应二值化更加适适用在明暗分布不均的图片,由于图片的明暗不均,导致图片上的每一小部分都要使用差别的阈值举行二值化处理,这时候传统的二值化算法就无法满足我们的需求了,于是就出现了自适应二值化。
自适应二值化方法会对图像中的全部像素点盘算其各自的阈值,如许能够更好的保留图片里的一些信息。
  1. @_typing.overload
  2. def adaptiveThreshold(src: cv2.typing.MatLike, # 图像数组
  3.                         maxValue: float,         # 最大值
  4.                         adaptiveMethod: int,    # 小区域内阈值的运算方法
  5.                          thresholdType: int,     # 二值化类型 有阈值法和反阈值法
  6.                             blockSize: int,      # 核的大小
  7.                         C: float,                # 自设阈值误差
  8.                         dst: cv2.typing.MatLike | None = ...)
  9.                      -> cv2.typing.MatLike: ... #返回一个二值化数组
复制代码
参数

此中各个参数的寄义如下:
maxval:最大阈值,一般为255
adaptiveMethod:小地域阈值的盘算方式:
ADAPTIVE_THRESH_MEAN_C:小地域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小地域内加权求和,权重是个高斯核
thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是阈值法和反阈值法
blockSize:选取的小地域的面积,如7就是7*7的小块。
c:最终阈值即是小地域盘算出的阈值再减去此值
应用

  1. import cv2
  2. img = cv2.imread('./1.png')
  3. img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  4. img_binary = cv2.adaptiveThreshold(img_gray,255,
  5.                                    cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
  6.                                    cv2.THRESH_BINARY,
  7.                                    7,
  8.                                    5)
  9. cv2.imshow("img",img)
  10. cv2.imshow('img_gray',img_gray)
  11. cv2.imshow('img_binary',img_binary)
  12. cv2.waitKey(0)
复制代码


 三、腐蚀

功能


  • 去掉毛刺和孤立像素‌:通过腐蚀操作,可以去除图像中的细小毛刺和孤立的像素点,从而提取出图像的骨干信息‌。
  • 边缘检测‌:腐蚀与膨胀操作联合使用,可以更有效地提取二值图像中的边缘信息。先膨胀再腐蚀可以使边缘更加明显‌。
  • 去除噪声‌:在二值图像中,大概存在一些噪声点或孤立的像素点。通过一定次数的腐蚀操作,可以消除这些噪声点,使图像更加清晰‌。
  • 提取文本地域‌:在图像处理中,通过腐蚀和膨胀操作可以方便地提取出文本地域,这对于文本辨认等应用非常有效‌。
参数

        
  1. def erode(src: cv2.typing.MatLike,
  2.           kernel: cv2.typing.MatLike,
  3.           dst: cv2.typing.MatLike | None = ...,
  4.           anchor: cv2.typing.Point = ...,
  5.           iterations: int = ...,
  6.           borderType: int = ...,
  7.           borderValue: cv2.typing.Scalar = ...)
  8.         -> cv2.typing.MatLike: ...
复制代码
参数:


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


  • dst: 腐蚀后的图像,这是一个包罗腐蚀操作结果的 NumPy 数组。
  1. def getStructuringElement(shape: int, # 创建核的形状
  2.                           ksize: cv2.typing.Size,  # 创建核的大小
  3.                           anchor: cv2.typing.Point = ...) \
  4.         -> cv2.typing.MatLike: ... # 返回一个核
复制代码
 


  • shape: 结构元素的外形,这是一个整数标识符,表示你想要生成的结构元素的外形。OpenCV 提供了几种预界说的外形,如矩形(cv2.MORPH_RECT)、椭圆形(cv2.MORPH_ELLIPSE)和十字形(cv2.MORPH_CROSS)。
  • ksize: 结构元素的尺寸,这是一个元组,表示结构元素的宽度和高度(通常是相同的,即正方形)。比方,(5, 5) 表示一个 5x5 的结构元素。
  • anchor: 锚点,这是一个可选参数,表示结构元素的中心点(或称为锚点)相对于结构元素左上角的偏移量。默认情况下,锚点位于结构元素的中心。
函数返回值:


  • 返回一个结构元素,这是一个 NumPy 数组,其数据范例通常为 uint8,而且数组中的元素值通常为 0 或 255(对于二值结构元素)。结构元素的外形和尺寸由 shape 和 ksize 参数决定。
应用

  1. import cv2
  2. img = cv2.imread('./1.png')
  3. img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  4. img_binary = cv2.adaptiveThreshold(img_gray,
  5.                                    255,
  6.                                    cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
  7.                                    cv2.THRESH_BINARY,
  8.                                    7,
  9.                                    5)
  10. kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
  11. img_binary_erode = cv2.erode(img_binary,kernel=kernel)
  12. cv2.imshow('img_binary',img_binary)
  13. cv2.imshow('img_binary_erode',img_binary_erode)
  14. cv2.waitKey(0)
复制代码

 
四、膨胀

功能

 膨胀操作主要用于增大图像中的物体,使物体的边缘向外扩展,同时也可以弥补物体内部的细小空洞。
参数

  1. def dilate(src: cv2.typing.MatLike,
  2.            kernel: cv2.typing.MatLike,
  3.            dst: cv2.typing.MatLike | None = ...,
  4.            anchor: cv2.typing.Point = ...,
  5.            iterations: int = ...,
  6.            borderType: int = ...,
  7.            borderValue: cv2.typing.Scalar = ...) \
  8.         -> cv2.typing.MatLike: ...
复制代码


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


  • dst: 膨胀后的图像,这是一个包罗膨胀操作结果的 NumPy 数组
应用


  • 增大物体‌:通过膨胀操作,可以增大图像中的物体,使其更加显眼。
  • 弥补空洞‌:对于图像中物体内部的细小空洞或裂缝,膨胀操作可以将其弥补,使物体看起来更加完备。
  • 连接物体‌:假如图像中的物体之间隔断较近,膨胀操作可以将它们连接起来,形成一个更大的物体。
  • 形态学重修‌:在图像分割、物体检测等使命中,膨胀操作可以作为形态学重修的一部分,帮助恢复或增强图像中的结构信息。
  1. import cv2
  2. img = cv2.imread('./1.png')
  3. img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  4. img_binary = cv2.adaptiveThreshold(img_gray,
  5.                                    255,
  6.                                    cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
  7.                                    cv2.THRESH_BINARY,
  8.                                    7,
  9.                                    5
  10.                             )
  11. kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
  12. img_binary_erode = cv2.erode(img_binary,kernel=kernel)
  13. img_binary_erode_dilate = cv2.dilate(img_binary_erode,kernel=kernel)
  14. cv2.imshow('img_binary_erode',img_binary_erode)
  15. cv2.imshow('img_binary_erode_dilate',img_binary_erode_dilate)
  16. cv2.waitKey(0)
复制代码
 

 五、仿射变换

功能

仿射变换是图像处理中的一种重要几何变换方法,它具有以下功能:

  • 改变图像的外形和位置‌:通过线性变换和平移,仿射变换可以机动地调整图像的外形和位置,满足差别的图像处理需求‌。
  • 保持图像的平直性和平行性‌:仿射变换后的图像仍然能够保持直线的平直性和平行线的平行性,这是仿射变换的一个重要特性‌
  • 实现多种图像变换操作‌:仿射变换可以包罗平移、旋转、缩放和剪切等多种操作,通过调整变换矩阵的参数,可以实现这些操作的组合,从而对图像举行复杂的几何变换‌
  • 应用于图像校正和对象辨认‌:仿射变换在图像校正、对象辨认以及增强实际等范畴有广泛应用。比方,在图像校正中,可以使用仿射变换来校正图像的倾斜或变形;在对象辨认中,可以通过仿射变换对图像举行预处理,进步辨认的准确率‌
  • 易于实现和盘算‌:在OpenCV等图像处理库中,仿射变换的实现非常简朴。只需获取仿射变换的矩阵,并通过相应的函数应用变换即可。同时,变换矩阵的盘算也相对容易,可以通过选择源图像和目标图像上的对应点来求解‌。
参数

  1. def getRotationMatrix2D(center: cv2.typing.Point2f,
  2.                         angle: float,
  3.                         scale: float) \
  4.         -> cv2.typing.MatLike: ...
复制代码
center: 旋转的中心点,通常是一个二元元组 (x, y),表示旋转中心的坐标。
angle: 旋转的角度,以度为单位。正值表示逆时针旋转,负值表示顺时针旋转。
scale: 缩放因子。默认情况下,这个值是 1.0,表示不缩放。假如你想要同时旋转和缩放图像,可以通过调整这个参数来实现。
  1. def warpAffine(src: cv2.typing.MatLike,
  2.                M: cv2.typing.MatLike,
  3.                dsize: cv2.typing.Size,
  4.                dst: cv2.typing.MatLike | None = ...,
  5.                flags: int = ...,
  6.                borderMode: int = ...,
  7.                borderValue: cv2.typing.Scalar = ...) \
  8.         -> cv2.typing.MatLike: ...
复制代码
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)。
应用

  1. import cv2
  2. img = cv2.imread('./1.png')
  3. M = cv2.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),45,0.8)
  4. img_new = cv2.warpAffine(img,M,dsize=None,flags=cv2.INTER_LINEAR,borderMode=cv2.BORDER_REFLECT_101)
  5. cv2.imshow("img",img)
  6. cv2.imshow('img_new',img_new)
  7. cv2.waitKey(0)
复制代码


六、 透视变换

功能

透视变换(Perspective Transformation)是图像处理中的一种几何变换,它模仿了人眼从某一特定角度观察物体时所产生的透视结果。

  • 模仿透视结果‌:透视变换能够模仿实际世界中物体由于隔断和观察角度差别而产生的透视结果,使二维图像出现出三维的立体感。
  • 改变图像的视角‌:通过透视变换,可以改变图像的视角,仿佛是从差别的位置或角度观察同一个场景。
  • 校正透视畸变‌:在拍摄照片或视频时,由于镜头或拍摄角度的原因,大概会产生透视畸变。透视变换可以用于校正这种畸变,使图像更加真实和准确。
  • 图像拼接和合成‌:在图像拼接或合成时,假如差别图像之间的透视关系差别等,可以使用透视变换将它们调整到相同的透视角度,从而实现无缝拼接或合成。
  • 增强实际应用‌:在增强实际(AR)应用中,透视变换用于将假造物体与实际世界中的场景相联合,使假造物体看起来像是真实存在于场景中一样。
参数

  1. def getPerspectiveTransform(src: cv2.typing.MatLike,
  2.                             dst: cv2.typing.MatLike,
  3.                             solveMethod: int = ...) \
  4.         -> cv2.typing.MatLike: ...
复制代码

src: 源图像中的四个点,通常是一个外形为 (4, 2) 的 numpy 数组或类似的数据结构,表示四个点的坐标。这四个点应该按照某种序次排列(比方,顺时针或逆时针),由于变换矩阵的盘算依靠于这个序次。
dst: 目标图像中的四个点,与 src 参数类似,也是一个外形为 (4, 2) 的 numpy 数组或类似的数据结构,表示变换后四个点应该位于的位置。
函数返回一个 3x3 的变换矩阵,可以使用 cv2.warpPerspective() 函数将这个矩阵应用于图像,从而执行透视变换。
  1. def warpPerspective(src: cv2.typing.MatLike,
  2.                     M: cv2.typing.MatLike,
  3.                     dsize: cv2.typing.Size,
  4.                     dst: cv2.typing.MatLike | None = ...,
  5.                     flags: int = ...,
  6.                     borderMode: int = ...,
  7.                     borderValue: cv2.typing.Scalar = ...) \
  8.         -> cv2.typing.MatLike: ...
复制代码
src: 输入图像,即你想要举行透视变换的源图像。
M: 透视变换矩阵,通常是一个 3x3 的矩阵,可以通过 cv2.getPerspectiveTransform() 函数盘算得到。这个矩阵界说了源图像中的点如何映射到目标图像中的点。
dsize: 输出图像的尺寸,以 (width, height) 的形式表示。这是变换后图像的尺寸。
dst: 输出图像,这是一个可选参数。
flags: 插值方法。
borderMode: 边界添补方法。
borderValue: 边界颜色【可选】。
应用

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('./card.png')
  4. points1 = np.array([[200,120],[700,170],[140,400],[650,460]],dtype=np.float32)
  5. points2 = np.array([[0,0],[img.shape[1],0],[0,img.shape[0]],[img.shape[1],img.shape[0]]],dtype=np.float32)
  6. M = cv2.getPerspectiveTransform(points1,points2)
  7. img_warp= cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))
  8. cv2.imshow("img",img)
  9. cv2.imshow('img_warp',img_warp)
  10. cv2.waitKey(0)
复制代码
 

 小练习:

1.辨认某一颜色,并举行更换·。
  1. import cv2
  2. import numpy as np
  3. img = cv2.imread("./1.png")
  4. img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
  5. hsv_min = np.array([35,43,46])
  6. hsv_max = np.array([77,255,255])
  7. img_mask = cv2.inRange(img,hsv_min,hsv_max)
  8. for i in range(img_mask.shape[0]):
  9.     for j in range(img_mask.shape[1]):
  10.         if img_mask[i,j] == 255:
  11.             img[i,j,:] = (203,192,255)
  12. cv2.imshow("image",img)
  13. cv2.imshow("image_mask_color",img_mask)
  14. cv2.waitKey(0)
复制代码


2.切割图片
  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('./card.png')
  4. w,h = img.shape[1],img.shape[0]
  5. x_min = 350
  6. x_max = 490
  7. y_min = 200
  8. y_max = 370
  9. if x_min<0 or x_max>w or y_min<0 or y_max>h:
  10.     print("切割的区域不合法")
  11. else:
  12.     # 圈出要切割的内容
  13.     cv2.rectangle(img,(x_min-2,y_min-2),(x_max+2,y_max+2),(0,0,255),2)
  14.     # 保存要切割的内容
  15.     img_roi = img[y_min:y_max,x_min:x_max]
  16.     cv2.imshow('image',img)
  17.     cv2.imshow('image_roi',img_roi)
  18. cv2.waitKey(0)
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表