OpenCV图像预处理
阈值法就是通过设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(通常代表背景),大于阈值的像素就被设置为maxval(通常代表前景)。与二值化算法相比,自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片上的每一小部分都要使用不同的阈值进行二值化处理,这时候传统的二值化算法就无法满足我们的需求了,于是就出现了自适应二值化。对于彩色图像的每个
一、图像色彩空间转换
1.1 RGB颜色空间
RGB颜色模型基于笛卡尔坐标系,如下图所示,RGB原色值位于3个角上,二次色青色、红色和黄色位于另外三个角上,黑色位于原点处,白色位于离原点最远的角上。因为黑色在RGB三通道中表现为(0,0,0),所以映射到这里就是原点;而白色是(255,255,255),所以映射到这里就是三个坐标为最大值的点。
注意:在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB
1.2 颜色加法
使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像
OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
import cv2 as cv
import numpy as np
cao = cv.imread('../images/cao.png')
pig= cv.imread('../images/pig.png')
# 饱和操作 cv.add(img1,img2)
dst1 = cv.add(cao,pig)
cv.imshow('dst1',dst1)
# numpy直接相加 取模运算 对256取模 250+10=4
dst2 = cao+pig
cv.imshow('dst2',dst2)
1.2.1 颜色加权加法
cv2.addWeighted(src1,alpha,src2,beta,gamma)
-
src1、src2:输入图像。 -
alpha、beta:两张图象权重。 -
gamma:亮度调整值。-
gamma > 0,图像会变亮。 -
gamma < 0,图像会变暗。 -
gamma = 0,则没有额外的亮度调整。
-
# 颜色加权加法
dst3 = cv.addWeighted(pig,0.7,cao,0.3,0)
cv.imshow('dst3',dst3)
1.3 HSV颜色空间
HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。RGB颜色模型使用红、绿、蓝三原色的强度来表示颜色,是一种加色法模型,即颜色的混合是添加三原色的强度。而HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。
HSV颜色模型是一种六角锥体模型,如下图所示:

1.4 颜色转换
cv2.cvtColor(img,code)
1.4.1 RGB转Gray(灰度)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
1.4.2 RGB转HSV
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
二、灰度化
2.1最大值法
对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。
# 最大值灰度化
for i in range(img_shape[0]): # 按行读取图片的像素bgr
for j in range(img_shape[1]): # 对每一行按照列进行每一个像素格子进行读取
image_np_gray[i, j] = max(image_np[i, j, 0], image_np[i, j, 1], image_np[i,j,2])# 求灰度值
2.2 平均值法
对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。
# 平均灰度化
for i in range(img_shape[0]):
for j in range(img_shape[1]):
image_np_gray[i, j] = (int(image_np[i, j, 0]) + int(image_np[i, j, 1]) + int(image_np[i, j, 2])) / 3#如果不转成int 会以uint8的数据进行加法计算 最后的结果超过255的时候会取模
2.3 加权均值法
对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。
wb, wg, wr = 0.114, 0.587, 0.299
# 循环遍历每一行
for i in range(shape[0]):
for j in range(shape[1]):
img[i, j] = round(wb*pig[i, j, 0]+ wg*pig[i, j, 1]+ wr*pig[i, j, 2])
三、图像二值化处理
一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
3.1 阈值法
阈值法就是通过设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(通常代表背景),大于阈值的像素就被设置为maxval(通常代表前景)。对于我们的8位图像(0~255)来说,通常是设置为255。
#image要二值化的灰度图 127代表阈值 255最大值超过就取它 cv2.THRESH_BINARY二值化的类型(简单的二值化)
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
3.2 反阈值法
与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval。
#image要二值化的灰度图 127代表阈值超过就取0 255最大值 cv2.THRESH_BINARY_INV二值化的类型
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('Binary Image', binary)
3.3 截断阈值法
截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变。换句话说,经过截断阈值法处理过的二值化图中的最大像素值就是阈值。
#image要二值化的灰度图 127代表阈值超过就取127 255最大值 cv2.THRESH_BINARY_INV二值化的类型
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_TRUNC)
3.4 低阈值零处理
低阈值零处理,字面意思,就是像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。
#image要二值化的灰度图 127代表阈值不超过就取0 255最大值 cv2.THRESH_TOZERO二值化的类型
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_TOZERO)
3.5 超阈值零处理
超阈值零处理就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0(也就是黑色),像素值小于等于阈值的部分不变。
#image要二值化的灰度图 127代表阈值超过就取0 255最大值 cv2.THRESH_BINARY_INV二值化的类型
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_TOZERO_INV)
3.6 OTSU阈值法
OTSU阈值法 默认结合cv.THRESH_BINARY
cv.THRESH_OTSU = cv.THRESH_OTSU + cv.THRESH_BINARY
注意:使用OTSU算法计算阈值时,组件中的thresh参数将不再有任何作用。
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_OTSU)
3.7 自适应二值化
与二值化算法相比,自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片上的每一小部分都要使用不同的阈值进行二值化处理,这时候传统的二值化算法就无法满足我们的需求了,于是就出现了自适应二值化。
自适应二值化方法会对图像中的所有像素点计算其各自的阈值,这样能够更好的保留图片里的一些信息。
3.7.1 取均值
cv2.adaptiveThreshold(image_np_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)
其中各个参数的含义如下:
maxval:最大阈值,一般为255
adaptiveMethod:小区域阈值的计算方式:
ADAPTIVE_THRESH_MEAN_C:小区域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是阈值法和反阈值法
blockSize:选取的小区域的面积,如7就是7*7的小块。
c:最终阈值等于小区域计算出的阈值再减去此值
image_np_adaptive = cv2.adaptiveThreshold(image_np_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10) # 自适应二值化
3.7.2 加权求和
image_np_adaptive = cv2.adaptiveThreshold(image_np_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 7, 10) # 自适应二值化
四、图像翻转(图像镜像旋转)
在OpenCV中,图片的镜像旋转是以图像的中心为原点进行镜像翻转的。
-
cv2.flip(img,flipcode)
-
参数
-
im 要翻转的图像
-
flipcode: 指定翻转类型的标志
-
flipcode=0: 垂直翻转,图片像素点沿x轴翻转
-
flipcode>0: 水平翻转,图片像素点沿y轴翻转
-
flipcode<0: 水平垂直翻转,水平翻转和垂直翻转的结合
-
-
face = cv.imread('../images/face.png')
# 翻转 镜像旋转 以图像中心为原点cv.flip(img, flipcode)
# flipcode = 0 垂直翻转 沿x轴 上下翻转
flip_0 = cv.flip(face,0)
cv.imshow('flip_0',flip_0)
# flipcode = 1 水平翻转 沿y轴 左右翻转
flip_1 = cv.flip(face,1)
cv.imshow('flip_1',flip_1)
# flipcode = -1 垂直+水平
flip = cv.flip(face,-1)
cv.imshow('flip',flip)
五、仿射变换
5.1 图像旋转
cv2.getRotationMatrix2D()函数
-
获取旋转矩阵
cv2.getRotationMatrix2D(center,angle,scale)
-
center:旋转中心点的坐标,格式为
(x,y)。 -
angle:旋转角度,单位为度,正值表示逆时针旋转负值表示顺时针旋转。
-
scale:缩放比例,若设为1,则不缩放。
-
返回值:M,2x3的旋转矩阵。
-
# 获取旋转矩阵 cv.getRotationMatrix2D(center, angle, scale)
M = cv.getRotationMatrix2D((250, 250), 90, 1)
# 仿射变换函数 cv2.warpAffine(img, M, dsize)(w,h)
dst = cv.warpAffine(cat, M, (cat.shape[1], cat.shape[0]))
5.2 图像平移
移操作可以将图像中的每个点沿着某个方向移动一定的距离。
-
假设我们有一个点 P(x,y),希望将其沿x轴方向平移t_x*个单位,沿y轴方向平移t_y个单位到新的位置P′(x′,y′),那么平移公式如下:
x′=x+tx
y′=y+ty
在矩阵形式下,该变换可以表示为:

这里的tx和ty分别代表在x轴和y轴上的平移量。
tx = 80
ty = 120
# 定义平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 仿射变换
dst = cv.warpAffine(cat,M,(500,500))
5.3 图像缩放
缩放操作可以改变图片的大小。
-
假设要把图像的宽高分别缩放为0.5和0.8,那么对应的缩放因子sx=0.5,sy=0.8。
-
点P(x,y)对应到新的位置P'(x',y'),缩放公式为:
x′=s_x*x
y′=s_y*y
在矩阵形式下,该变换可以表示为:

相较于图像旋转中只能等比例的缩放,图像缩放更加灵活,可以在指定方向上进行缩放。
sx和sy分别表示在x轴和y轴方向上的缩放因子。
# 定义缩放量
sx = 0.6
sy = 0.5
# 定义缩放矩阵
M = np.float32([[sx,0,0], [0,sy,0]])
# 仿射变换
dst = cv.warpAffine(cat,M,(500,500))
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)