基于Python的Opencv学习

基于Python的Opencv学习第三天

各位小伙伴们大家好,今天是我学习Opencv的第三天,从第一篇博客开始到现在是第三篇博客了,介绍的都是比较基础的,我个人感觉就是因为比较基础我才给记录下来,因为基础的函数或者概念我们才用的最多,好啦,话不多说,继续学习吧!!!

一.使用numpy包来访问像素

在之前我的博客里面是在import cv2里面直接读取像素然后对像素进行处理的,今天我们学一个不一样的,就是使用numpy包来访问像素。

1.读取像素
在这里用numpy包读取像素的方法和直接读取像素不同,我们需要用item()函数来读取像素。具体使用方法如下:

返回值=图像.item(位置参数)

对于两种图像(灰度图和彩色图)有两种不同的返回值。

灰度图 返回灰度值
彩色图 返回值为B,G,R的值

示例:
灰度图 p=img.item(88,142)
彩色图 blue=img.item(78,125,0)
green=img.item(78,125,1)
red=img.item(78,125,2)

在这里,img为我定义的图像的名称,然后调用了item()函数,在灰度图里面,两个数据直接是像素坐标,彩色图里面多了第三个是通道的值(至于像素坐标和通道,如果有不理解的小伙伴,可以看我前两篇博客来了解一下)。

2.修改像素

修改像素我们需要用到itemset()函数,具体使用语法如下:

图像名.itemset((位置x坐标,位置y坐标),新值)

来看示例:
灰度图 img.itemset((88,99),255)
彩色图 img.itemset((88,99,0),255)

在这里我就不过多赘述,看语法和示例就能明白每个数字含义。

>>> import cv2
>>> import numpy as np
>>> i=cv2.imread(r"C:\Users\LT010407\Desktop\0.jpg")
>>> print(i.item(100,100,1))
30
>>> i.itemset((100,100,1),255)
>>> print(i.item(100,100,1))
255
>>> 

基于Python的Opencv学习_第1张图片
在这里我在idle上面运行了代码,小伙伴们可以看到结果已经很好的展示在了我们的idle上面。

刚刚介绍了用numpy包来对像素进行操作,感觉还是在介绍老的知识点,小伙伴们别着急,现在我立马介绍一个新的东西,肯定能够让你们产生兴趣。

二.图像ROI

1.图像ROI是什么
ROI中文是感兴趣区域,指从被处理的图像以方框,圆,椭圆,不规则多边形等方式勾勒出需要处理的区域,可以通过各种算子和函数来求得感兴趣区域ROI,并进行图像的下一步处理。文字还是表达不清楚,还是用代码来解释一下可能更容易理解。

import cv2
img=cv2.imread(“图像名称”)
face=img[200:400,200:400]

基于Python的Opencv学习_第2张图片

如上图,黄色的是我们调用的那张图像,蓝色的范围(坐标已经给出)是指我们感兴趣区域(即ROI),再结合代码就能明白,我们取出感兴趣区域的图像(蓝色区域)赋给了face。
我相信这么一说大家更能够理解什么是ROI了吧。

2.图像ROI的语法
至于语法,在刚刚介绍中我好像全给说完了,哈哈哈。这样吧,直接上代码吧,就能够看的更明白。

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\1.jpg")
>>> face=img[200:400,200:400]
>>> cv2.imshow("picture1",img)
>>> cv2.imshow("face",face)
>>> 

基于Python的Opencv学习_第3张图片
这里是我们的代码,小伙伴们可以先思考一下会发生什么情况。

铛铛铛,我们来揭晓结果把。

这个是我命名的picture1的图像,一张很好看的风景图。
基于Python的Opencv学习_第4张图片
这个是我命名face的一张图像,取自那个picture1图像的200到400行和200到400列的所有像素点组成的图像,这下小伙伴们明白了图像ROI的语法了吧。

可能有小伙伴会问,我都取出来了一块图像,那我能不能给这个图像加在原图的任意位置呢,答案是肯定可以的,而且我们不仅仅可以给这个感兴趣区域的图像取出来放到原图里面去,还可以给这张图像放到任何一张图像里面,大家请往下看。
在这里我们可以直接进行图像ROI的选取,然后直接进行赋右值就可以改变图像。先来看代码。

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> pic=cv2.imread(r"C:\Users\LT010407\Desktop\3.jpg")
>>> face=img[100:200,100:200]
>>> pic[150:250,120:220]=face
>>> img[0:100,0:100]=face
>>>> cv2.imshow("img",img)
>>> cv2.imshow("pic",pic)
>>> 

基于Python的Opencv学习_第5张图片
基于Python的Opencv学习_第6张图片
在这里我们可以看到,我分别截取了那个皮卡丘的眼睛然后先在皮卡丘那张图片上复制到0:100行和0:100列,然后在第二幅风景图纸150:250行和120:220列又再次进行复制。
其实大家看到这儿,估计对我们的这个图像ROI已经有了充分的认识了,通俗一点来说就是先截取一段图片,然后我们可以给这段图片随意指定位置或者直接在一个新窗口弹出,可以类别计算机里面的copy和paste来理解。

三.通道的拆分与合并

1.通道的拆分
我们再来介绍一下,关于彩色图通道的拆分。通道的拆分意味着什么呢,首先,我们知道彩色图是由B,G,R三个通道所构成的,那么我们可以给这三个通道独立出来就是拆分的过程。如果我们直接使用opencv来进行拆分,那么可以用以下语法完成:

img=cv2.imread(“图像名”)
b=img[ : , : ,0]
g=img[ : , : ,1]
r=img[ : , : ,2]

但是在opencv里面有专门用来进行通道拆分的split()函数,来看一下语法:

一次性拆分:
img=cv2.imread(“图像名”)
b,g,r=cv2.split(img)
将三个通道拆分出来后可以得到三个灰度图像
来看一下代码和结果:

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b,g,r=cv2.split(img)
>>> cv2.imshow("B",b)
>>> cv2.imshow("G",g)
>>> cv2.imshow("R",r)
>>> 

基于Python的Opencv学习_第7张图片
大家可以看到我现在已经给三个通道拆分了出来,分别得到三个不同的灰度图像,这就是一次性拆分三个通道的代码和结果展示。

除了一次性拆分还可以每次只得到一个通道来拆分,这里就可以在split()函数后面加一个下标就可以实现:

img=cv2.imread(“图像地址”)
b=cv2.split(img)[0]
g=cv2.split(img)[1]
r=cv2.split(img)[2]

如果只需要一个通道的图像,那我们就不需要写其他通道的代码,至于代码和实现结果和一次性拆分相似,这里我就不赘述了。

2.通道的合并
有拆分肯定得给合并起来,这里我们就用到merge()函数,具体语法如下:

img=cv2.imread(“图像地址”)
b,g,r=cv2.split(img)
bgr=cv2.merge([b,g,r])

在这里我们需要注意合并的顺序,即[b,g,r]的顺序,如果是写反了[r,g,b]的顺序的话,就无法得到我们想要的图像。

来看代码和结果展示:

>>> import cv2
>>> img=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b,g,r=cv2.split(img)
>>> cv2.imshow("B",b)
>>> cv2.imshow("G",g)
>>> cv2.imshow("R",r)
>>> bgr=cv2.merge([b,g,r])
>>> rgb=cv2.merge([r,g,b])
>>> cv2.imshow("bgr",bgr)
>>> cv2.imshow("rgb",rgb)
>>> 

基于Python的Opencv学习_第8张图片
这个我们可以看到,如果我们合并的顺序正确,那么我们能够得到一只非常可爱的皮卡丘,但是如果合并顺序出错,那么这个皮卡丘就变颜色了,也并不是我们想要的结果。

接下来我想再介绍一下拿任意一个通道与两个等大的空白通道合并,来看看效果吧

>>> import cv2
>>> import numpy as np
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> rows,cols,chn=a.shape
>>> b=cv2.split(a)[0]
>>> g=np.zeros((rows,cols),a.dtype)
>>> r=np.zeros((rows,cols),a.dtype)
>>> m=cv2.merge([b,g,r])
>>> cv2.imshow("merge",m)
>>> 

这里我想介绍一下zeros()函数,用法如下:
zeros(shape,dtype=float,order=‘C’)
返回值是得到一个给定形状和类型的用0填充的数组
参数分析如下:
①shape:即该数组形状(几乘几的矩阵)
②dtype:数据类型,有多种可选参数,默认numpy.float64
(此处为了和原图像参数保持一致,就直接用了a.dtype)
③order:可选参数,C代表与c语言类似,行优先;F代表列优先
基于Python的Opencv学习_第9张图片
这个是结果,显示的是一大片蓝色 ,如果不是只用蓝色通道,而只是分别用其他两种颜色通道,得到的结果就是绿色和红色,这里就不再赘述。

好啦,今天讲了很多了,我觉得有重要的地方,也有一些基础的,当然总的来看,这还是基础中的基础,小伙伴们就先看看吧,毕竟我也是刚刚入门。大家共同进步吧!!!(转载注明出处)

你可能感兴趣的:(Python-opencv,opencv,python,编程语言,计算机视觉,数据分析)