一、二值化(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