2022-12 opencv教程 task3

滚动条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

  1. 构建查找表 look up table 定义一种映射
  2. 查找表应用
    查找表优势,预计算,空间换时间,避免重复计算,节约计算时间
  • 从数学上来看查找表是一个简单的一对一或多对一的函数,定义了如何将像素转换为新的值。
  • 从数据的组织关系上来看,查找表是一维或多维的数组,存储了不同输入值所对应的输出值。
  • 查找表在图像处理中主要用于像素的点运算,尤其是像素之间无位置相关性的操作中,如:图像色彩空间压缩、图像取反、图像分割,直方图均衡化等仅需要考虑像素值的应用。
  • 当需要对图像应用窗口运算等与像素位置相关的操作时,就不能使用查找表。

例子 图像预处理 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三通道图像中,该函数会让你输入一个低值数组和高值数组,然后这个函数会扫描图片的每个像素,每个像素的值,即这个数组的每个值,如果相对应的,都在两个你输入的数组的,相对应的位置的数值内,那么这个数值会被设置为白色。否则只要有一个不在这个范围内,那么就会设置为黑色。
浙ICP备19012682号