OPENCV(python)--初学之路(二)
昨天时间太短了,今天估计能多写一点,感谢支持。这里,我们将创建用以显示指定颜色的简单程序。 你有一个显示颜色的窗口和三个轨迹栏,用来指定 B,G,R 颜色。你可以滑动轨迹栏改变窗口的颜色。默认情况下,初始颜色为黑色。对于 cv.createTrackbar() 函数,第一个参数是轨迹栏名字,第二个参数是被附上的窗口名字,第三个参数是默认值,第四个是最大值,第五个是回调函数——滑条改变所执行的函数。
一.前言
昨天时间太短了,今天估计能多写一点,感谢支持。
二.主要内容
1.调色板的跟踪栏
1.解释函数
这里,我们将创建用以显示指定颜色的简单程序。 你有一个显示颜色的窗口和三个轨迹栏,用来指定 B,G,R 颜色。你可以滑动轨迹栏改变窗口的颜色。默认情况下,初始颜色为黑色。
对于 cv.createTrackbar() 函数,第一个参数是轨迹栏名字,第二个参数是被附上的窗口名字,第三个参数是默认值,第四个是最大值,第五个是回调函数——滑条改变所执行的函数。这个回调函数也有一个默认参数,表示轨迹栏位置。我们并不关心函数做什么事,所以只是简单提一下。
轨迹栏的另一个重要应用是用作按钮或者开关。OpenCV在默认情况下没有按钮功能,因此我们用轨迹栏实现这样的功能。在我们的程序中创建了一个开关,其中程序只会在开关打开时有效,否则屏幕始终是黑色。
2.代码演示

2图像基本操作
这个和opencv关系不大是关于Numpy ,熟悉 Numpy 后才能使用 OpenCV 编写更好的优化后代码。
1.访问和修改像素值
首先,一张图像有自己的属性:宽,高,通道数。其中宽和高是我们肉眼可见的属性,而通道数则是图像能呈现色彩的属性。我们都知道,光学三原色是红色,绿色和蓝色,这三种颜色的混合可以形成任意的颜色。常见的图像的像素通道也是对应的R,G,B三个通道,在OpenCV中,每个通道的取值范围为0~255。(注:还有RGBA,YCrCb,HSV等其他图像通道表示方法)。即,一般彩色图像读进内存之后是一个h * w * c的矩阵,其中h为图像高(相当于矩阵的行),w为图像宽(相当于矩阵列),c为通道数。
生成一张黄色的图片

因为黄色为绿色和红色的混合。所以,该图像的所有像素值都应为R=255,G=255,B=0。
2.与一般的numpy.array一样,可以通过 img.shape 访问图像的形状。它返回一组由图像的行、列和通道组成的元组(如果图像是彩色的):
>>>print(img.shape)
(128,128,3)
通过 img.size 访问图像的总像素数:
>>>print(img.size)
562248
图像数据类型可以由 img.dtype 获得:
>>>print(img.dtype)
UINT8
注意 img.dtype 在调试时非常重要,因为 OpenCV-Python 代码中的大量错误由无效的数据类型引起。
2.图像中的感兴趣区域
有时我们将不得不处理某些图像区域。对于图像中的眼部检测,在整个图像上进行第一次面部检测。当获得面部后,我们单独选择面部区域并在其内部搜索眼部而不是搜索整个原始图像。它提高了准确性(因为眼睛总是在脸上:D)和性能(因为我们在一个小区域搜索)。
使用 Numpy 索引再次获得 ROI(感兴趣区域)。在这里,我选择球并将其复制到图像中的另一个区域:
>>>ball = img[280:340,330:390]
>>>img[273:333, 100:160] = ball
如下图所示:

3.拆分和合并图像通道
有时您需要在 B,G,R 通道图像上单独工作。在这种情况下,您需要将 BGR 图像分割为单个通道。在其他情况下,您可能需要将这些单独的通道合并至 BGR 图像。您可以通过以下方式完成:
>>>b,g,r = CV.spilt(img)
>>>img = CV.merge((b,g,r))
警告:CV.spilt()是一项代价高昂的操作(就时间而言)。所以只在你需要时再这样做,否则使用 Numpy 索引。
或者使用numpy.array的切片方法
>>>b = img[:,:,0]
假设您要将所有红色像素设置为零,则无需先拆分通道。Numpy 索引更快:
>>> img[:,:,2] = 0
4.制作图像边界(填充)
如果要在图像周围创建边框,比如相框,可以使用 CV.copyMakeBorder()
eg:replicate = CV.copyMakeBorder(img1,10,10,10,10,CV.BORDER_REPLICATE)
- src-输入的图像 ,top,bottom,left,right-上下左右四个方向上的边界拓宽的值(即这里的img1,10,10,10,10,)
- 而最后的则是边框类型
-
- CV.BORDER_CONSTANT- 添加一个恒定的彩色边框。该值应作为下一个参数value给出。
- CV.BORDER_REFLECT-边框将是边框元素的镜像反射,如下所示:fedcba|abcdefgh|hgfedcb
- CV.BORDER_REFLECT_101或者 CV.BORDER_DEFAULT-与上面相同,但略有改动,如下所示: gfedcb | abcdefgh | gfedcba
- CV.BORDER_REPLICATE -最后一个元素被复制,如下所示: aaaaaa | abcdefgh | hhhhhhh
- CV.BORDER_WRAP-不好解释,它看起来像这样: cdefgh | abcdefgh | abcdefg
-
value- 如果边框类型为CV.BORDER_CONSTANT,则这个值即为要设置的边框颜色
大家可以自己试一试。

3.图像的算术运算
1.图像加法
您可以通过 OpenCV 函数,cv.add()或简单地通过 numpy 操作将两个图像相加,res = img1 + img2。两个图像应该具有相同的深度和类型,或者第二个图像可以是像素值,比如(255,255,255),白色值。
注意 OpenCV 相加操作和 Numpy 相加操作之间存在差异。OpenCV 添加是饱和操作,而 Numpy 添加是模运算。要注意的是,两种加法对于结果溢出的数据,会通过某种方法使其在限定的数据范围内。
2.图像混合
这也是将图像相加,但是对图像赋予不同的权重,从而给出混合感或透明感。图像按以下等式添加:![]()

三.最后一语
冰冻三尺非一日之寒,今天先学到这,我还学要算法,感谢各位!!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)