00:19
嘿。下午好呀,各位。铁子们,欢迎大家来看我的直播。大家可以听到我说话吗?可以听到我的声音吗?呃,因为这个这节实验课涉及到内容比较多,还有因为我个人原因,这个录制的时候那个时间比较长,然后有半个多小时,正好那会儿轮我的时候就赶中午了,所以就是可能会影响到大家的,嗯,吃饭还有休息,所以就是呃,还得占用大家下午的上课时间。
01:08
感觉挺不好意思的。啊,那么人还没有到齐,在这节课讲课以前呢,啊,先给大家就是简单做一个这节实验课的一个引导吧。就是这节实验课,咱们主要讲授的是啊,就是呃,彩色空间的转换,主要是由三原色RGB,像这个呃,青阳红黄CMY,还有色调饱和度,亮度SI。亮度色调y iqy UV以及YCBCR,哎,这五种彩色空间之间的相互转化,就是RGB向后面这五种彩色空间相互转化,一共就是一一共就是呃,二乘以五就是十种。
02:01
十种相互转化,而且就是呃,这节实验课主要是为了给大家以美的享受啊,特意精心选取了我的这个桌面背景图作为这个原始图像。给大家做一个这个,呃,空间上的变换。那么除此之外呢,还有两个拓展点,拓展一就是对多图的处理,因为咱们之前对的是这个单一图像,然后一变换进行了处理,那么如何在同一个程序中对多副图像同时进行处理呢?这是拓展点一所涉及到的内容。那么拓展点二。拓展点二就是呃,对于视频的一个处理,前面都是对图像做处理,对视频是否能进行处理,如何处理呢?这是拓展点二所涉及到的内容。呃,那么视频如何来源呢?就一个字,爬,所以对这个爬的过程要有一个简单的设计。呃,讲到这儿,不知道大家有没有对这个视频这个实验有点期待呢?
03:06
反正我是觉得挺有意思的,那么人到的差不多了,给大家先放视频吧。谢谢老师,谢谢各位,谢谢大家。Hello,大家好,欢迎大家来到荣仔Python小课堂,那么今天主要为大家讲解的是如何使用Python程序来实现。数字图像处理中的彩色空间转换。那么在这一讲呢,主要从下面四个方面为大家分别讲述,首先是实验名称,然后是实验目的,第三,实验代码,第四,实验总结。下面我们看第一部分实验名称。这节实验课的名称叫passion,实现彩色空间转换。
04:05
接下来是实验目的,实验目的这里有3.1、理解并掌握彩色空间变换的具体内容,二、掌握Python实现五种彩色空间相互转换的方式,三。在此基础上能对多图及视频做相应处理。第三点是拓展点。那么下一面是实验代码,在实验代码部分,将对五种彩色空间的相互转换做详细的解释。首先来看,第一个是RGB转CMY。我们来看这个Python代码。在这一部分。
05:02
右边这个是它的公式。那么首先呢,这一句,这是对RGB3通道进行分离。然后归一化。然后用一分别减去2GB,最后再把三通道进行合并,输出这个结果。这一句是读取这个呃,图片文件,然后对图片文件进行这个。这个这个。嗯,函数的这这个操作,然后呃,因为这前面归一化了,所以这里如果输出的话,还得再乘以255。然后对这个,呃。得出的图片呢,进行一个。保存以及展示。
06:01
下面运行一下,看一下效果。好,左边这个这就是原图,右边这个这是CMY空间上的图。而且已经把这个C这个图已经保存到F盘下的这个文件里头。以便下面的CMY转RGB的时候再转回去。那么知道了这个RGB转CMY,下面我们实现一下CMY转RGB,从这个公式可以直接推导出,哎,把这个右边这一项移到左边左,把左边这一项移到右边,就可以实现这个CMY转RGB。同样把这个公式截取出来。我们来看一下它的代码。
07:00
CMY转RGB是这个。看一下和上面一样,就是中间的这一部分不一样,这一部分也就是把呃,上面这个。一减RGB换成一减CMY。然后运行一下这个图片,图片就是。这个图片就是上一步转化成的,呃,这个CMY图片。这个是转化以后的效果,又回到了原图。那么上面这两个就是RGB转CMY,以及CMY转RGB的。实验代码。接下来我们看一下RGB转SSHSI和HSI转RGB,这里也已经给出了。
08:00
公式。同样截取,我们来看一下。这个代码部分。具体在这个位置。同样,这里也和上面一样,就不多说了,这里主要说一下这个公式的实现。首先呢,是对这个得到的这个图像呢,对这个长和宽做一下提取,然后把这个RGB3个通道进行分离,分离以后进行归一化,归一化之后呢。哎,这个归一化,归一化之后算一下这个,呃。西塔西塔,然后分子是这个nu是不是。1/2R减GR减G,然后R减B。分母呢是二倍根号下,所以这个开方,开方里面是R减G的平方,R减G的平方加上R减B。
09:07
然后乘以G减B。分子除以分母,再除以呃,再再取一个这个呃2COS。是吧,然后就算出这个西塔,那么根据这个西塔呢,啊,因为这里,因为这个啊,咱们算这个处于分母,分母的话得你你得这个,呃,考虑它分母为零的情况,如果不考虑它会报错的。所以在这一部分呢,哎,就是当等于分母等于零的时候,这个H等于零。然后。看这个H,这现在这个算的是H,然后在B小于等于G的时候,H等于西塔。记。啊,小于这个B的时候,然后是这个公式,然后那么下面呢。就是算的是S啊,同样,然后把这个公式写进去,就是这一部分,那么I也就是这一部分。
10:07
然后呃,再把这个,因为前面这个是呃归一化,所以后面呢。要扩充到二五一方面显示。这就是这个代码,我们运行一下,看一下效果。好,这个是右边这个是原图,左边这个是咱们作为这个HSI空间下的图像变换后的图像。把它注释掉。这个变化后的图像,我们在这里也已经保存到F盘下的这个文件中了啊,以便下面对这个呃,再转换回去,再转换回去,那么。
11:00
这里也给出了HSI转到RGB空间下的。公式啊,我们按照这个公式继续看一下它的代码。这一部分。那么在这一部分中呢,其他都一样,就是中间的这个公式不一样,这个也就是分成了在呃,零度到120度之间的话,哎,是这个公式B是吧?是I乘以一减S。然后R是这个公式。G是这个公式,同样的在120到240度之间,以及240度到360度之间是这个公式,其他都一样都不变,先前面也是先进行这个归一化,后面然后对通道这个进行扩充啊,一方面显示,那么我们运行一下看一下效果。
12:08
好。左边这个这是。哎,上一步得到的,呃。这个。HSI图像,HSI图像,然后在这个代码里面,它作为原图像,那么右边这个就是它转化后的图像,就是咱们原本的那个图像。这是这一部分的代码。那么下面是这个RGB转YIQ,以及YIQ又转回RGB,这里我实现了这个在Python代码下实现了,呃,2GB转YQ以及YQ转2GB,但是不知道因为什么原因它这个转不回去,所以我在这个MATLAB中实现,给大家看一下这个吧。
13:03
然后。我们还跟前面一样,把这个。公式提取出来看一下。My lab。然后2GB转 YIQ2gB转YIQ的时候,首先呢是对文件进行读取,然后呢对三通道进行分离,分离以后来进行这个矩阵分别啊,左矩阵乘以右矩阵,然后写成这一个形式,然后把这个图像输出,我们运行一下,看一下效果。哎,左边这个就是原图像,右边这个就是咱们通过呃变换,然后得到的YQ图像。
14:00
同样把右边那个图像进行保存,保存之后,然后再进行YQ转化回RGB。IQ转化成RGB,也就是中间这个矩阵进行一下变化,其他也没有变化,所以我们只需要把这个RGB转YIQ的这一个部分的。哎,这个数值变化一下就可以了,那么我们看一下效果,看一下是否是。回到了原图像啊,回到了二级B图像。那么左边这个就是我们上一步得到的YQ图像,在这个程序中呢,它作为原始图像,右边这个是通过代码实现的,又又转换回RGB图像。这是这一部分,那么下一部分我们介绍一下这个RGB图像转化成。Yu UV图像。这里也已经给出了实现的。
15:02
代码。和前面一样,实际上就是中间的这个数值发生了一下变化。那么在这里我们看一下RGB转YUV。这是这一部分代码。那么我们首先把这个作为啊左矩阵,然后给它列出来,然后呃,这个同样进行这个分离,啊RGB进行分离,然后呃左矩阵,这个左矩阵乘以右矩阵。那么这一步这个copy重copy了一份,然后对这个copy的重重新,哎,复制的这一份进行,呃操作是因为如果不进行这一步的话,那么原图像会被覆盖。原图像会被覆盖,所以要进行这一步。
16:00
这个程序其实很简单的,给大家再运行一下,看一下效果。好好,这里忘说了,这个open CV库,它自己就提供了一个从RGB转向YUV的这个呃,函数。啊,然后就是这一句实现的,那么。这个是原始图像,这个是通过open CV库得到YUV图像,这个是自己写的啊,这个然后得到VV图像,大家可以看到实际上差别还是很大的。那么我们对这个open CV库得到的。Yu UV图像进行保存啊进行保存,然后我们再通过。这个实际上就是和这个就是左矩阵的数字不一样啊,然后就不多说了,直接给大家看一下代码。
17:09
运行一下。就是这个位置和这个位置不一样,其他地方都一样。好,这个就是我们上一步得到的这个YUV图像是吧,然后呃。然后这个是通过open CV库提供的。啊,函数,然后实现的。图像复原,复原回RGB,然后这个是通过自己写的那个程序啊,那个函数,然后实现。这是这个代码,然后下边的话就是。最后一个。最后一对RGB转YCBCR,以及YCBCR转成RGB,那么这里也给出了公式,我们就通过公式再来看一下啊相应的代码。
18:15
RGB转YCBCR。呃,这个主函数其实还是一样的,就是这个中间的公式,实际上每个都是中间的公式不一样,头和尾导入的库和尾基本上都是一样的啊,那么。我们看一下这个就是呃,左边它加了一个这个也算列向量啊,然后我们把这个列向量写出来,然后右边的话,这个RGB这三个。哎,通道的这个向量,那么呃,然后把它当成这个矩阵,然后左边的话呢,这个就是它的左矩阵啊,RGB就相当于是右矩阵,然后左矩阵右矩阵,哎左呃,这个是左矩阵,然后这个是单独的这个。
19:07
一个列列列的这个矩阵啊,然后呃,在这个位置啊,我们进行这个左矩阵乘以右矩阵,就实现的是这一部分,然后再加上这个十六幺二八幺二八,然后就实现了由RGB转YCBCR。我运行一下,看一下效果。在这里,我们把这个转化成的YCBCR图像也保存到F盘下的这个图片文件中。这个右边这个图像啊,这是原图像,那么左边这个图像就是。通过这个程序转化后的YCBCR空间图像。那么把这个左边那个图像啊,刚刚说了保存了,保存以后呢,然后再进行下一步,下一步也是就是这个啊,公式不一样啊,我们再把这个公式截取出来看一下。
20:12
这个。还有公式不一样啊,左边这个左矩阵呢,然后我们写出来,哎,右边这个是个呃,YCBCR矩阵减去十六幺二八幺二八矩阵,那么把十六幺二八幺二八矩阵解出来,那么这个啊,就是实线的右边这一项等号右边这一项,然后我们分开了啊,就是左边这个乘以YCBCR减去左边这个。乘以啊,这不是后面这个吗?十六幺二八幺二八,哎,我们在这已经定义了16128128SHIFT这个啊。哎,然后这个把它的返回,然后呢,预习一下。
21:14
那么右边这个图像啊,就是哎,这个这个程序中的原图,左边这个就是转化后的,由YCBCR图像转化后的。RGB图像又回到了原图。那么至此,五个空间之间,这个五个空间彩色图像之间的转换也就到此结束了。那么以上分别讲述完之后,下面就进入了拓展部分,首先拓展一是进行多图的一个呃统一的一个变化,那么前面都是对单一图片进行了这个呃分别的。
22:02
这个转换啊,空间上的转换,那么如何在一个程序中实现对多幅图像的统一转换呢?那么我们来看一下。在这里呢,就是啊,主要以。这个RGB转CMY给大家演示一下,大家有兴趣可以把下面的分别进行演示,我们CTRLC复制之后呢,在这个下面。重新粘贴一下,然后。如何变化呢?呃,我们在这个。之前啊已经啊对嗯,这个图片进行了保存,那么啊首先啊是呃,我先要对这三幅图片012F盘下面的012这三副图片进行一个呃,在一个程序中进行转换,那么怎么实现呢?很简单,就用。
23:01
这个for循环啊,依次实现就行,那么我们来写一下for IE range,然后一共有三幅图片是吧,012,然后。循环一下。然后进行一下这个缩进。进行一下缩进,那么为什么不进行这两个缩进,那么如果把这两个也一起缩进到后面以后,它只循环一下,然后就把这个窗口关闭了,所以就实现不了三幅图片同时来进行这个循环的效果,那么呃,下面我们得把这个也改一下。然后这是点format。然后对输出的图片的这个名字啊,也进行一下改变。
24:01
与前面一样啊点儿。这样就应该差不多了,那么我们来运行一下。好,那么也就是这个。哦,我就说怎么图片不一样。这里。我用的是E盘的。那么这里改一下。刚刚是F盘。OK。那么这是这个。D0啊,编号为零的这个图片,左边这个是原图片,右边这个是它转化后的CMY图片。那么第二个就是我这个桌面背景。
25:00
这个。左边这个是它的原图,右边这个是CMY图,那么第三个是从网上找一个风景画,右边这个是原图,左边这个是变化后的CMY图。好,那么这个就是对多图。这个拓展啊,进行了一下这个代码实现。那么下面进行这个拓展二,拓展二是对视频进行彩色空间转换。那么如何转换呢?与前面这个类似啊,我们把这个。复制过来。重新粘贴一下。然后我们就在对这个程序啊,进行这个变换。对视频进行变换,我们变换哪一部分呢?首先啊,我们要对这个视频进行一个。
26:04
什么呀?对视频进行一个读取,读取视频啊,用到了这个open CV库里面的。Video capture方法。哎,这里填上。这里填的是这个视频的名称啊,我们一会儿再来说这个视频的事情,那么下面呢,呃,对这个视频进行一个读取之后呢,然后把这个视频就转化到上面这个函数中进行一个实现。啊,我们把这个转化后的视频,我们附一个值赋给这个video吧。然后呢,下面对这个,呃。
27:03
Video,然后进行上面这个。这个函数的变化啊,我们把这个video传入进来,传入进来。哎,就可以了,插入进来实现这个就可以了,那么我们主要是对这个函数进行一个变换。那么首先这里是video。因为是图片嘛,图片,呃,因为是视频嘛,视频,然后它是有多帧的,那么所以就是无限循环吧。所以这里填这个well true。然后。这个进行一下缩进。缩进之后呢,首先我们对这个图片啊进行一下啊这个读取。
28:02
读取图片的帧率以及。这个原原图是吧,哎,这个video。Video。然后我们把这个传给,把它的帧率传给这个right,然后把这个原视频呢传给frame。OK,那么进行完这一步以后呢,如果哎下面进行一个语句判断,为什么要进行语句判断,就是哎什么时候结束这个程序什么时候结束呢?就是他当他这个帧理结束的时候,哎没有的时候,然后就结束,当他有这个帧率还在,这个视频还在播放的时候,那么我们就还继续。啊,对这个视频进行一个啊,每一帧进行一个处理,所以我们这里用到了这个if else1句,那么if如果那个没有啊,这个帧率的时候。
29:08
然后我们就跳出这个啊处。哎,就结束这个程序的执行,那么否则的话呢。否则的话,哎,我们就对每一帧的图像进行一个处理处理,还有是依照这个二级B转CY这个。哎,核心代码进行一个呃转换,那么转换以后,我们把这个得到的这个结果啊。得到这个结果,然后进行一个啊展示。然后我们用这个C2。这个。IAM show这个方法是吧,然后呃,这里输出图像的标题。
30:02
我们起个什么呀,VI Du吧,简单一点,VI Du,然后呃,这个。这是一个我们把原图像啊,首先把原图,呃,原原视频,原视频进行一个展示,视频进行一个展示,那么接下来呢,哎,就是对我们把这个。转化后的这个结果result进行一个展示。那么这个就是c my c my video。然后result。是吧,然后把这个展示展示之后呢。哎。让他的这个呃,刷新的速度。啊,用这个。
31:01
CV2点。Wait k。速度就是它的这个帧率。那么这个。视频啊情况下的这个啊,2GB转CY就已经实现好了,那么我们运行一下看一下,哎,这个啊,这个视频还没有传入,那么视频怎么获取呢。一个字,啪。那么在这里简单给大家说一下这个。视频吧。我们在这里呢,主要爬取的是六间房啊这个。我们拍一些小姐姐视频。那么在这个小视频里头呢?我们发现啊,我也不知道为什么这里全是女的。全是漂亮小姐姐,那么我们就把这个视频爬取下来,然后。对这个视频呢,来进行一个RGB转CMY的处理。
32:06
那好,接下来首先给大家看一下这个程序。啊,这个首先呢,爬虫程序的话,首先是导入库,导入request库,Jason库以及re库,Request库呢是啊排on爬虫常用的一个库,Jason库呢是把Jason这个数据转换成pythson来能够解析的一个数据,而一库呢是对字符串进行处理,那么首先定义一个函数用于替换非法字符,因为我们后面在这个呃呃,这个这个视频保存文件保存的时候啊,需要这个视频文件的啊,原视频文件的这个题目啊,如果在这个情况下呢,如果这个题目中有冒号,星号,问号等等这个符号的时候呢。它就可能会报错,那么为了防止报错啊,我们首先呢,哎,呃,定义一个函数啊,用于替换这个非法字符。
33:05
那么接下来就进入核心的爬取过程,爬取呢,首先呢,获取URL地址以及hand参数,那么这个参数以及地址怎么确定呢?来我们看一下这个页面,这个页面像这个呃页面的话。我们进行到这个页面底端,然后自动加载到下一页数据,这种动态加载的方式啊,我们就是在这个F12键。在F12键这个network数据包里面的这个XHR里面找啊像这种,那我们重新加载一下,我们看一下这是第一页数据,那么加载到第二页动态,加载到第二页数据的时候,第二个数据包,那么加载到第三页数据,第三个数据包,第四个数据包啊依次往下,那么呃,我们刚刚所说的URL地址在哪个地方呢?URL地址就在这个handles参数里面的request URL里面,哎,以及后边的这个handle参数在哪呢?在这个URL agent里面,前面这个部分是你电脑的信息,后面这个是谷歌浏览器的内核啊。
34:17
那么还有一个需要大家注意的是什么呢?呃,这个,呃,第一个文,那这个数据包,第二个数据包,第三个数据包,第四个数据包,它们区别是什么?大家看这个位置,第四页啊这是四,第三页这是三,第二页这是二,哎第一页这里是一,那么我们通过这个规律就可以排取多页的哎数据。那么就是在这个位置,然后呢,通过呃,接下来呢,通过这个request库来模拟浏览器发送URL地址的这个请求。然后下面一步一步进行操作,这里写的比较详细,这里就不再赘述了,那么最后呢,是对爬取到的视频做一个保存,保存到F盘下的beautiful girl video这个文件夹里,然后呢,这个每个视频文件以视频的。
35:11
这个呃,原视频的名称以及原视频作者来进行命名。那么我们运行一下。正在爬取第一页啊,这个视频啊,正在下载第一个视频。因为网速比较慢,可能大家得稍等一会儿。那么第一个视频下载完毕,第二个视频,哎,现在正在下载第三个视频。啊,它在慢慢下载,具体下载到这个F盘的。这个文件夹里还这不是刚刚下载的这三个视频,那么正在下第四个视频。哎,因为这个视频较多,这个网速较慢,所以就不下载了这个啊,程序到时候会给到大家。
36:03
那么大家运行以后自己存到自己U盘啊,没事儿干的时候慢慢看好吧,那么接下来啊,我们爬取这个视频就是为了对视频进行这个空间上的处理,所以我们假设对第一个视频进行处理的话,我们在这个。呃,首先对它重命名一下,重命名一下,命名成哎,Video命名成video。然后通过这个属性啊。把他的视频地址复制过来。复制到哎,我们刚刚写的程序的这个部分。粘贴过来,然后。啊,避免这个转移啊,前面加一个二,我们运行一下看一下效果。哎,好,这就是这个视频的运行效果,那么左边就是刚刚爬取到的视频啊,右边这个就是在啊CMY空间下的这个转换后的视频。
37:10
那么这个程序什么时候结束呢?这个程序啊,就要等到这个视频播放完以后,它真的没有的时候,自动就结束,自动就退出啊,窗口就自动会关闭。好,那么这个视频结束啊,这个程序也就随之结束了,好,那么这这个就是实现的视频格式下的,哎,RGB空间转CMY空间。
38:16
好,那么以上呢,就是对多图以及视频啊两个方面进行了一下拓展。那么进入第四部分,第四部分就是对这个实验的总结,那么我们从对单一图片进行处理,以及到多图进行处理,以及到视频进行处理啊,然后呃,对,逐渐深入吧。那么给大家留一个小的作业吧,呃,大家看一下,那么怎么实现啊?对单一,刚刚是实现了对单一视频进行处理,如何实现对多个视频进行处理呢?这是给大家留一个呃,小的思考点。
39:05
好,以上就是关于今天讲的啊,五种彩色空间啊,相互转换的这个实验内容,那么更多原创的这个作品呢,大家可以关注我的个人CSDN博客啊,里面呢,有一些这个分的专栏,有王者荣耀角度下看23种设计模式专栏,这个一共有25篇已经更新完毕了,以及最近正在写的互联网+智慧专栏,以及拍爬虫专栏。好,以上就是这节课的所有内容,那么感谢大家的聆听,也期待与大家一起交流,共同进步,谢谢大家,再见。谢谢大家啊,大家这个视频应该是听完了,听完的同学扣个一吧,扣个一,听完的同学扣个一。
40:09
啊,那么啊,谢谢各位,谢谢各位,那么最后我给大家就是总结两点,然后也是对这个实验的一个总结,那么第一点就是我们在比如说RGB转CMY的时候,呃,首先对这个呃通道进行分离以后,然后对这个通道GB3种通道要进行归一化,归一化之后呢,在最后输出图像的时候,哎,要这个乘以255,如果不乘以这个255,会发生什么情况呢?就是会展示图像,图像的时候会展示成一个,呃什么样子呢?大家可以想得到吗?就是只进行归一化,最后不乘以255,然后展示图像的时候,会展示成一个什么情况?
41:02
呃,我给大家说一下吧,就是它会展示出完全就是黑的一幅图像,因为就是零是黑色嘛,然后255是白色,所以就是,呃,规划就是把所有的像素,然后归成零到一之间,一也可以看成是黑色。一页看可以看成是黑色,然后零到一之间,然后就可以都看成是黑色,所以就是呃展示只规划不乘以255的话,最后展示出来的这个呃图像就是完全是一个黑色的,那么再总结一个第二点,第二点就是给大家留的那个思考题,我们在最开始对单一图片进行处理之后,对多图进行处理的时候,用这个for循环,那么。嗯。呃,之后不是对单视频进行处理嘛,然后呃给大家留的那个问题,如何对多视频进行处理,对多视频助理其实也是可以使用呃负二循环的,也是可以使用负二循环的。
42:02
那么这是我给大家做的一个小的总结,大家还有什么问题吗?有的话可以提出来。然后没有的话,回复一个no吧。好的,那么今天的这个直播呢,就到此结束了啊,嗯,那么再一次感谢大家这么长时间来看我的直播,也感谢大家点赞,感谢大家的配合回复,那么也感谢老师给的这样的一次锻炼的机会啊,感谢大家。那么啊,直播到此结束。班长,可以听到吗?
43:06
需要连麦吗?要交流交流吗?啊,OKOKOK,那么今天的直播就到此结束啊,感谢大家观看,谢谢大家,再见。
我来说两句