目录
一、图像基础变换
1. 图像翻转 / 旋转:
基于坐标变换,对图像像素位置进行重新映射。水平翻转交换左右像素坐标,垂直翻转交换上下像素坐标,旋转则依据旋转矩阵公式(如绕原点旋转 θ 角,坐标 (x,y) 变换为 (xcosθ - ysinθ, xsinθ + ycosθ) )计算新坐标。
cv2.flip(img,flipcode)
参数:
imE: 要翻转的图像
flipcode: 指定翻转类型的标志
flipcode=0: 垂直翻转,图片像素点沿x轴翻转
flipcode>0: 水平翻转,图片像素点沿y轴翻转
flipcode<0: 水平垂直翻转,水平翻转和垂直翻转的结合
2. 常见的图像仿射变换及应用
- 图像旋转:是仿射变换特殊形式,通过仿射变换矩阵(包含旋转角度、缩放、平移等参数),可绕任意点旋转,更灵活控制图像方向。
- 图像平移:依据平移向量 (tx, ty) ,将每个像素 (x,y) 移至 (x + tx, y + ty) ,常用于图像拼接时对齐相邻图像、跟踪目标运动轨迹时补偿位移 。
- 图像缩放:改变图像尺寸,有等比例缩放和非等比例缩放。等比例缩放保持图像宽高比,避免变形;非等比例缩放可拉伸或压缩图像,用于适配不同显示分辨率,如手机屏幕与电脑屏幕的图像适配 。
- 图像剪切:提取图像感兴趣区域(ROI),按照指定坐标范围裁剪,比如从大幅风景照中截取特定景物特写,便于后续聚焦分析 。
3. 基本原理:
仿射变换是一种二维(或多维)空间的线性变换(如缩放、旋转、剪切)与平移变换的复合操作,能保持图像 “平直性”(直线变换后仍为直线)和 “平行性”(平行线变换后仍平行 ),公式表示为:
其中,(x,y)是原图像像素坐标,(x′,y′)是变换后坐标;实现线性变换(缩放、旋转、剪切等),
实现平移,最后一行
[0,0,1]
用于齐次坐标表示,统一线性变换与平移的计算 。
齐次坐标的作用:
传统笛卡尔坐标难以直接融合平移(属于非线性变换)与线性变换,引入齐次坐标后,可将仿射变换表示为矩阵乘法,简化计算流程,让缩放、旋转、平移等操作通过一个变换矩阵完成。
4. 关键变换类型与原理
4.1 缩放:
缩放变换矩阵为:
- 效果:
sx > 1
时 x 轴拉伸,sx < 1
时 x 轴压缩;y 轴同理。若sx = sy
为等比缩放,否则为非等比缩放,可能导致图像 “拉伸变形”。
4.2 旋转:
cv2.getRotationMatrix2D()函数
例如:cv2.getRotationMatrix2D(center,angle,scale)
M=cv.getRotationMatrix2D((300,400),-45,1)
center:旋转中心点的坐标,格式为
(x,y)
。angle:旋转角度,单位为度,正值表示逆时针旋转负值表示顺时针旋转。
scale:缩放比例,若设为1,则不缩放。
返回值:M,2x3的旋转矩阵。
4.3 平移
- 正偏移:t
x > 0
时图像右移,ty > 0
时图像上移;- 负偏移:反之则左移、下移。
4.4 剪切
原理:沿 x 轴剪切时,变换矩阵为(
b
是剪切系数);沿 y 轴剪切时为(
c
是剪切系数)。
二、图像色彩空间转换与操作
(一)基础颜色空间
- RGB 颜色空间:由红(R)、绿(G)、蓝(B)三原色组成,是计算机显示系统基础,通过不同强度三原色组合呈现丰富色彩,覆盖人眼可识别大部分颜色 。
- 颜色加法:对应 RGB 通道数值相加,改变图像整体亮度、色彩混合,比如叠加滤镜效果,模拟不同颜色光混合 。
- 颜色加权加法:给 RGB 通道不同权重系数后相加,精准调整色彩平衡,突出或弱化某种颜色,像强调红色调营造暖色调氛围 。
import cv2 as cv
import numpy as np
cao=cv.imread(r'E:\ziliao\hqyj\kejian\1\lianxi\01day\images\images/cao.png')
pig=cv.imread(r'E:\ziliao\hqyj\kejian\1\lianxi\01day\images\images/pig.png')
print(cao.shape)
print(pig.shape)
dst1=cv.add(cao,pig)
dst2=cao+pig
cv.imshow('dst1',dst1)
cv.imshow('dst2',dst2)
x=np.uint8([[250]])
y=np.uint8([[10]])
xy1=cv.add(x,y)
xy2=x+y
print(xy1)
print(xy2)
# 颜色加权加法 cv.addWeighted(img1,a,ing2,b,c)
dst3=cv.addWeighted(pig,0.7,cao,0.3,50)
cv.imshow('dst3',dst3)
cv.waitKey(0)
cv.destroyAllWindows()
cv.add()
是 OpenCV 提供的加法函数,专门用于图像处理。当处理uint8
类型(范围 0-255)的数据时,采用饱和运算,如果相加结果超过 255,则直接截断为 255,确保不会溢出。- NumPy 的加法(
+
)遵循模运算(modulo arithmetic)规则。对于uint8
类型,其范围是 0-255,当计算结果超过 255 时,会自动对 256 取模(即结果 = 原值 % 256)。
总结:
-
cv.add()
:更适合图像处理,保证像素值不会超出合理范围,避免视觉失真。 -
NumPy 加法:遵循计算机底层整数运算规则,速度更快,但需要开发者自行处理溢出问题。
(二)HSV 颜色空间
原理:将颜色分解为色调(H,色彩种类)、饱和度(S,色彩鲜艳程度)、明度(V,色彩明亮程度),更贴合人眼对色彩感知习惯 。
应用:图像分割中依据色调、饱和度筛选特定颜色区域(如识别蓝天、绿叶);色彩调整时,单独调节饱和度让图像更鲜艳或柔和 。
H: 0— 180
S: 0— 255
V: 0— 255
(三)颜色空间转换
- RGB 转 Gray(灰度):通过加权平均(如 Gray = 0.299R + 0.587G + 0.114B )将彩色图像转为灰度图,突出图像亮度信息,简化后续处理(如边缘检测、OCR 文字识别,常先转灰度图减少计算量 ) 。
cv2.cvtColor(img,code)
code
:指定转换的类型,可以使用预定义的转换代码。
- RGB 转 HSV:借助数学公式(如通过三角函数计算色调,归一化计算饱和度、明度 )实现转换,便于针对色彩属性精准处理图像,在色彩增强、颜色识别任务中广泛应用 。
三、灰度实验
(一)灰度图
每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度。
(二)最大值法
原理:计算图像局部区域(如邻域)像素最大值作为该区域灰度值,增强图像亮部细节,突出明亮物体 。
应用:检测图像中高光区域、提取明亮目标(如夜景中车灯、发光标志 ) 。
(三)平均值法
原理:计算局部区域像素平均值作为灰度值,平滑图像、降低噪声,模糊细节同时让图像整体更均匀 。
应用:预处理图像去除随机噪声,或者制作模糊背景突出前景主体 。
shape=img.shape #h,w,c
img1=np.zeros((shape[0],shape[1]),dtype=np.uint8)
# 循环遍历每一行 拿到最大的通道值
for i in range(shape[0]):
for j in range(shape[1]):
#int转为更大的数据类型,防止溢出
img1[i,j]=(int(img[i,j,0])+int(img[i,j,1])+int(img[i,j,2]))//3
(四)加权均值法
原理:对局部区域像素按距离等因素加权后求平均,距离目标像素近的权重高,更注重保留图像边缘等细节,平衡平滑与细节保留 。
应用:图像去噪同时想尽量保留纹理、边缘信息,如医学影像处理(X 光、CT 图像),既去除噪声又不丢失病变特征 。
shape=img.shape #h,w,c
img1=np.zeros((shape[0],shape[1]),dtype=np.uint8)
# 定义权重
wb,wg,wr=0.114,0.587,0.229
# 循环遍历每一行 拿到最大的通道值
for i in range(shape[0]):
for j in range(shape[1]):
#int转为更大的数据类型,防止溢出
img1[i,j]=round(wb*img[i,j,0]+wg*img[i,j,1]+wr*img[i,j,2])
(五)两个极端的灰度值
在灰度图像中,“极端”的灰度值指的是亮度的两个极端:最暗和最亮的值。
- 最暗的灰度值:0。这代表完全黑色,在灰度图像中没有任何亮度。
- 最亮的灰度值:255。这代表完全白色,在灰度图像中具有最大亮度。
四、图像二值化处理
(一)二值图像
原理:像素值只有 0(黑)和 255(白)两种,简化图像表示,突出主体与背景差异,数据量极低 应用:文档扫描 OCR 识别(突出文字与纸张背景)、指纹识别(提取纹路特征)、简单形状检测(如识别二维码轮廓 ) 。
其操作的图像也必须是灰度图。也就是说,二值化的过程,就是将一张灰度图上的像素根据某种规则修改为0和maxval(maxval表示最大值,一般为255,显示白色)两种像素值,使图像呈现黑白的效果,能够帮助我们更好地分析图像中的形状、边缘和轮廓等特征。
简便:降低计算量和计算需求,加快处理速度。
节约资源:二值图像占用空间远小于彩色图。
边缘检测:二值化常作为边缘检测的预处理步骤,因为简化后的图易于识别出轮廓和边界。
(二)阈值法(THRESH_BINARY)
原理:设定阈值 T,像素值 > T 设为 255,≤ T 设为 0,分割图像为前景(白)、背景(黑),简单直接 。
应用:背景单一图像分割(如识别黑色文字在白色纸张,设定阈值区分 );图像二值化基础操作,为后续形态学处理、轮廓提取做准备 。
(三)反阈值法(THRESH_BINARY_INV)
原理:与阈值法相反,像素值 > T 设为 0,≤ T 设为 255,反转前景背景 。
应用:需要突出背景、弱化前景场景,或者配合阈值法提取互补区域(如先阈值法取文字,反阈值法取纸张背景 ) 。
(四)截断阈值法(THRESH_TRUNC)
原理:像素值 > T 则设为 T,≤ T 保持不变,限制图像亮部,压缩高光区域动态范围 。
应用:处理过曝图像(如照片中天空过亮,截断高光保留细节 );图像增强中,调整局部亮度范围 。
(五)低阈值零处理(THRESH_TOZERO)
原理:像素值 > T 保持不变,≤ T 设为 0,抑制暗部噪声、突出亮部有效信息 。
应用:暗部有较多噪声的图像,去除暗部干扰,聚焦亮部特征分析(如工业探伤图像,突出缺陷亮斑 ) 。
(六)超阈值零处理(THRESH_TOZERO_INV)
原理:像素值 > T 设为 0,≤ T 保持不变,抑制亮部噪声、突出暗部信息 。
应用:亮部有噪声干扰的图像,提取暗部特征(如夜视图像中,去除强光干扰,凸显弱光下目标 ) 。
(七)OTSU 阈值法(cv.THRESH_BINARY cv.THRESH_OTSU=cv.THRESH_OTSU+cv.THRESH_BINARY)
原理:自动计算最优阈值,基于图像灰度直方图,寻找使类间方差最大的阈值,分割效果更优,适应不同对比度图像 。
应用:复杂背景图像分割(如自然场景中识别物体,无需手动调阈值 );医学影像、工业检测等自动化程度高的场景,准确分割目标与背景 。
(八)自适应二值化
- 取均值:
原理:将图像划分为多个子区域,计算每个子区域均值作为该区域阈值,适应图像局部亮度差异
应用:光照不均匀图像(如文档扫描有阴影),保证不同区域文字都能清晰二值化 。
- 加权求和:
原理:子区域阈值计算时,对邻域像素加权求和(如距离越近权重越高 ),更精准贴合局部特征,提升二值化精度 。
应用:高精度图像识别任务(如芯片表面缺陷检测),在复杂光照、纹理下准确分割缺陷与正常区域 。