
本系列为超级适合新手入门的opencv教程上一篇OpenCV实战第一篇计算机的眼里你的自拍只是一堆破烂Mat数组本篇内容访问与修改图片像素内容ROI(感兴趣)区域目录本系列为超级适合新手入门的opencv教程本篇内容1.获得图片的大小与类型函数(实际上是属性不过我们可以当作函数使用他们)语法翻译代码函数讲解函数的结果如何修改图片的内容呢3.ROI感兴趣区域4. 图像通道的分割4.1.split函数函数语法翻译代码函数讲解函数举例函数结果merge函数函数语法翻译代码函数讲解函数结果4.2 直接分离(使用数组)**原理**4.3进阶方法numpy原理在上一篇我们知道每一个图片在opencv程序之中是以一个mat数组或者ndarray数组进行存储的所以我们可以以操作每一个像素的方法以一个极其细致的方法对这个图片进行操作首先我们先读取一个图片importcv2#导入opencvtore_path./resources/image/tore.png#读取图片的路径torecv2.imread(tore_path)#获取图片数组1.获得图片的大小与类型print(tore.shape)#获得图片的大小和类型函数(实际上是属性不过我们可以当作函数使用他们)语法defshape(self)-tuple[int,...]翻译代码函数 shape(自身)-元组[整形]函数讲解在源代码之中对shape函数的描述如下Anything that can be coerced to a shape tuple翻译出来就是任何可被强制转换为形状元组的对象。那么在这里这个可以被转换成形状元组的对象就是一张图片。那么什么是形状元组呢形状元组分为两种一种是对于拥有三通道图片的另一种是对于灰度图的。第一种为高,宽,通道数第二种为(高宽)这样我们就能获得这个图片的大小和类型。函数的结果(1000,1000,3)如何修改图片的内容呢我们使用的是类似于直接修改图片数组里面的元素的方法。tore[100,100][255,255,255]我们可以把图片的左上角看作原点这个坐标就是以这样的方法来设定坐标的。我们把[100100]这个地方的像素变成白色。虽然可能有些看不太清楚但是在这个部分能看到一个白色的小点我们还有别的需求如果我们需要一条白线呢tore[100:120][255,255,255]我们把纵坐标的100到120这一段设定为白色而不设定横坐标那么就会默认是把所有满足这一点的变成白色。那么大家可以去试试如果把再把横坐标设定为100:200我们该怎么做呢3.ROI感兴趣区域什么是感兴趣区域就是在这个图像之中我们需要重点关注的区域。tore_interesttore.copy()# 复制一个这样的图片tore_interest_settore[250:850,250:850]# 提取这个图片的一个部分可以看作是切割这个图像4. 图像通道的分割对于分离图片的颜色通道我们有很多种办法4.1.split函数函数语法defsplit(m:Mat|ndarray[Any,dtype]|ndarray,mv:Sequence[Mat|ndarray[Any,dtype]|ndarray]|None...)-Sequence[Mat|ndarray[Any,dtype]|ndarray]翻译代码函数 split(输入矩阵:Mat数组 [或] ndarray数组[任意类型, 每个元素的数据类型[泛型]] [或] ndarray数组, 输出向量序列:序列[Mat数组 [或] ndarray数组[任意类型, 每个元素的数据类型[泛型]] [或] ndarray数组] [或] None空值 ...) - 输出:序列[Mat数组 [或] ndarray数组[任意类型, 每个元素的数据类型[泛型]] [或] ndarray数组]函数讲解在这里我们以三个变量作为蓝色、 绿色、红色三个通道但注意这里输出的是一个灰度图所以我们不能输出一个彩色的图片。函数举例tore_colortore.copy()b,g,rcv2.split(tore_color)# 分离通道mergedcv2.merge((b,g,r))# 合并通道函数结果这是函数的结果(b)merge函数函数语法defmerge(mv:Sequence[Mat|ndarray[Any,dtype]|ndarray],dst:Mat|ndarray[Any,dtype]|ndarray|None...)-Mat|ndarray[Any,dtype]|ndarray翻译代码函数 merge(输入矩阵序列:序列[Mat数组 [或] ndarray数组[任意类型, 每个元素的数据类型[泛型]] [或] ndarray数组], 输出矩阵:Mat数组 [或] ndarray数组[任意类型, 每个元素的数据类型[泛型]] [或] ndarray数组 [或] None空值 ...) - 输出:Mat数组 [或] ndarray数组[任意类型, 每个元素的数据类型[泛型]] [或] ndarray数组函数讲解这个函数的作用是合并图像通道它的参数就是我们使用上一个函数分离出来的图像通道。我们能够把三个通道合并起来或者把一个通道合并三次我们当然也可以两个两个的合并不过这个函数必须输入三个参数(或者说三个参数的意义最大我们可以使用单参数和四参数不过用的不多故而我在此写三个参数)所以我们可以创建一个相同大小的ndarry数组但在这里我就跳过了如何创建ndarray数组直接给大家进行使用由此这个函数有多种合并方式。但注意。注意每个元素出现的次数所在的位置的不同所得到的东西都完全不一致。举例merged cv2.merge((b,g,g))merged cv2.merge((g,g,b))merged cv2.merge((b,b,g))merged cv2.merge((b,g,r))这三个产出的图片效果都完全不一样懂了吗懂了的自刎归天(刘备音)还有一个好玩的就是你可以直接的展示b也可以把三个b合并在一起这个样子如果这个做的话两张图片在肉眼看起来是完全一致的就是一张灰度图。函数结果bgrbbr4.2 直接分离(使用数组)原理我们可以把图片的相关数据看作一个元组这个元组就是上面写过的形状数组故而tore_color_bluetore_color[:,:,1]最后的那个数字可以是012。代表着bgl三色。4.3进阶方法numpy原理opencv和numpy的关联很多我们可以把这个看作是一个numpy数组。importnumpyasnpimportcv2 b,g,rcv2.split(tore_color)zeronp.zeros(tore.shape[:2],dtypenp.uint8)tore_color_bluecv2.merge([b,zero,zero])cv2.imshow(tore,tore_color_blue)导入Numpy包把b、g、r三个变量弄出来。创造一个全0数组这个全零数组的长宽和图片的长宽是一致的,shape的意思就拿出这个三通道图片的前两个数组即长宽。把zero当作参数放到里面出来的也是一个三通道图片由这个方法弄出来的图片是三通道图片和上面两个图片是不同的