Python OpenCV 图像处理再循环,第一阶段复盘
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 40 篇。
基础知识铺垫
经过一个阶段的努力,我们已经来到了 Python OpenCV 学习的第二个阶段,本阶段将对之前的学习的内容查漏补缺,再进一步。
图像中的像素
我们在研究一下图像中像素是如何呈现的吧。首先编写一个普普通通的图片展示代码。
输出数据如下,由于是彩色图像,呈现的是一个三维数组。
数组与列表的区别,可以仔细观察一下。

通过输出类型,可以获取 image
是 <class 'numpy.ndarray'>
类型的数据。
三维数组最内层的三个数字就是一个像素的取值,分别表示 BGR,取值范围是 0~255 合计 256 种取值。
每个值都表示的是亮度,所以 0 表示最暗,255 表示最亮。
获取单通道数据与像素值的加减操作
采用下述代码,可以获取图像单通道数据
得到的数据如下:
单通道数据,呈现的是一个二维的数组。将单通道图片呈现出来,显示如下,单通道提取的图像为灰度图像。测试代码如下:

如果希望获取到的通道呈现出 BGR 中的颜色,只需要设置其他通道值为 0,那获取到的图像依然就是彩色图像。

下述代码将得到偏黄色的图像,因为 G(绿色)+R(红色) = Y(黄色)。

接下来咱可以实现图像的加减操作,具体代码如下:
查看像素的输出,发现每个值都进行了添加操作。

但是当像素值增加之后,超过了 255,结果会对 256 取余,例如 212+50=262 % 256 = 6
。

边界填充
今天顺便补充一下边界填充的相关知识,核心用到的函数是 ``cv2.copyMakeBorder` ,函数原型如下:
其中最重要的参数就是 borderType
,定义要添加边框的类型,其它的只是一些数值。
borderType
具体取值如下:
cv2.BORDER_CONSTANT
:添加的边界框像素值为常数(需要额外再给定一个参数,就是value
参数);cv2.BORDER_REFLECT
:添加的边框像素将是边界元素的镜面反射,类似于gfedcb|abcdefgh|gfedcba
,注意竖线左右的值即可;cv2.BORDER_REFLECT_101
orcv2.BORDER_DEFAULT
:和上面类似,但是有一些细微的不同,类似于gfedcb|abcdefgh|gfedcba
,注意竖线左右的数值,没有a
;cv2.BORDER_REPLICATE
:使用最边界的像素值代替,类似于aaaaaa|abcdefgh|hhhhhhh
,直接延伸边界像素值;cv2.BORDER_WRAP
:cdefgh|abcdefgh|abcdefg
。具体的你可以在 官方手册 继续学习。最后一个value
参数:如果borderType
为cv2.BORDER_CONSTANT
时需要填充的常数值。
dst
:添加完边框的新图像,需要记住图像的新尺寸为 (src.shape[1]+left+right, src.shape[0]+top+bottom)
。通过下述代码,进行完成的呈现。
运行结果如下图所示,注意 plt
绘图后图片的横纵坐标表示的是图像的像素数量。学习的时候,对比着刚才的字母说明,然后在看着图片学习一下,很容易可以掌握。

橡皮擦的小节
希望今天的 1 个小时你有所收获,我们下篇博客见~
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/f1eb912647d0b08a2a1cfb00b】。文章转载请联系作者。
评论