滚动条trackbar操作
用于highgui模块显示调参
UI组件 - 事件响应
- Callback基本流程
int createTrackbar( const String &trackbarname, #轨迹条的名字
const String &winname, #窗口名字。窗口得存在才能创建滑动条
int* value, #滑块的初始值
int count, #滑块的最大值(最小位置的值始终为0)
TrackbarCallback onChange=0, #回调函数
void* userdata=0 #用户传给回调函数的数据 );
事件响应函数
typedef void(* cv::TrackbarCallback)(int pos, void *userdata)
- pos 滑动条当前位置表示的值
- void *userdata 用户传递的参数,自己添加参数的话会提示没有写回调函数
- 完成事件响应函数的声明与实现
def trackbar_callback(pos):
print(pos)
创建窗口函数
cv.namedWindow(winname [, flags]) -> None
- winname 窗口标题 const string&型
- 参数flags支持的flag有:
- WINDOW_NORMAL - 可以调整窗口大小 没有限制 全图显示
- WINDOW_AUTOSIZE - 根据图像大小自动适应,不可调 是默认值(imshow就是autosize)
- WINDOW_KEEPRATIO - 可以保持比例窗口,调整大小,不一致能保持
推荐前两种
调整图像亮度
- RGB值表示亮度
- RGB(0, 0, 0) 黑色 -》 RGB(255, 255, 255)白色
- add函数支持 图像+图像 与 图像+常量 方式
- subtract函数支持 图像+图像 与 图像+常量 方式
- 通过他们可以修改图像的亮度 改变亮度的像素值
- 动态调整,基于滚动条修改常量值,实现动态修改图像亮度并刷新显示
键盘相应操作
键盘响应事件
cv.waitKey([, delay] ) ->retval
- delay如果没有声明或者delay=0,表示一直阻塞
- delay大于0,表示阻塞指定毫秒数ms
- retval返回的对应键盘键值ASCII,注意: 在不同的操作系统中可能会有差异
- WINDOWS下 典型的 retval = 27 是 ESC按键
- 通常 键盘按键的符号可以使用 ord() 函数来转换;它以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值
- 功能是不断刷新图像
响应不同的键盘操作
- 检查返回键值,根据不同键值完成不同操作
- 推荐使用 if-elif-else, switch-case 方式 python3.10支持
11 颜色表操作
查找表 - LUT
- 构建查找表 look up table 定义一种映射
- 查找表应用
查找表优势,预计算,空间换时间,避免重复计算,节约计算时间
- 从数学上来看查找表是一个简单的一对一或多对一的函数,定义了如何将像素转换为新的值。
- 从数据的组织关系上来看,查找表是一维或多维的数组,存储了不同输入值所对应的输出值。
- 查找表在图像处理中主要用于像素的点运算,尤其是像素之间无位置相关性的操作中,如:图像色彩空间压缩、图像取反、图像分割,直方图均衡化等仅需要考虑像素值的应用。
- 当需要对图像应用窗口运算等与像素位置相关的操作时,就不能使用查找表。
例子 图像预处理 Gamma校正
-
Gamma校正是一种非常重要的非线性变换。对输入图像的灰度值进行指数变换,进而校正亮度偏差,通常应用于扩展暗调的细节。
-
Gamma校正可使得图像看起来更符合人眼的特性。
-
当Gamma校正的值大于1时,图像的高光部分被压缩而暗调部分被扩展;
-
当Gamma校正的值小于1时,图像的高光部分被压缩而暗调部分被压缩。
-
公示 p(x, y) 表述输入图像像素值
-
Gamma = K * E’ = 255 * E^{logp(x,y)/255)*gamma}
- gamma的取值范围为 0.05~5之间
- 像素值取值范围在0~255之间,每一个值对应一个输出值,这样映射关系,可以先建立查找表LUT
- 根据输入的像素值作为index,在LUT中直接映射读取得到gamma校正之后得值
- 对256x256大小的图像,计算量对比:- 不应用查找表计算gamma - 65536次
- 应用查找表计算gamma - 256次
OpenCV中LUT支持
cv.applyColorMap(src, colormap[, dst]) -> dst
- src 输入图像 灰度图或彩色图CV_8UC1 or CV_8UC3
- colormap 颜色表 使用opencv自带的十二种颜色查找表
- dst 返回图像
- 伪色彩函数
- 用伪色彩更好地显示数据的例子是红外、高度、压力、密度、湿度,这些数据灰度范围较大,对比度不明显,我们将灰度图转变为彩色数据便于人类的视觉系统进行可视化
cv::LUT(src, lut)->dst
- src:输入图像矩阵,其数据类型只能是CV_8U。
- lut:256个像素灰度值的查找表,单通道或者与src通道数相同。
- dst:输出图像矩阵,其尺寸与src相同,数据类型与lut相同。 - 支持用户自定义
12 通道分离与合并
通道分离与合并
- RGB/HSV彩色通道分离为单独通道可单独访问,也可以将单独三通道合并成一幅图像
- 针对不同通道使用不同阈值提取mask
- 提取其中一个通道的信息
分离函数
- 通道分离函数
cv.split(m[, mv]) ->mv
- m 输入图像,必须是多通道图像
- mv 分离之后的单通道图像,m有几个通道,mv就有多少个参数
合并与混合
cv.merge(mv[, dst]) -> dst
- mv 各个通道,必须有着一样的尺寸和深度
cv.mixChannels(src, dst, fromTo)->dst
- src 输入多通道图像,大小和深度必须相同
- fromTo 指定被复制通道与要复制到的位置组成的索引对
- dst 返回结果,大小深度必须与src[0]相同
- mixChannels 主要就是把输入的图像(或图像集)的某些通道拆分复制给对应的输出图像(或图像集)的某些通道中,其中的对应关系由 fromTo 参数制定。
通道阈值
cv.inRange(src,lowerb,upperb[,dst])->dst
- src 输入图像
- Lowerb 低值
- Upperb 高值
- dst = (lowerb < src < upperb)
- 作用是可以提取你想要的颜色,并把该颜色的区域设置为白色,其余的设置为黑色
- 原理是这样的:在RGB三通道图像中,该函数会让你输入一个低值数组和高值数组,然后这个函数会扫描图片的每个像素,每个像素的值,即这个数组的每个值,如果相对应的,都在两个你输入的数组的,相对应的位置的数值内,那么这个数值会被设置为白色。否则只要有一个不在这个范围内,那么就会设置为黑色。