数字图像处理不得不知的点(opencv)
【如有问题,欢迎讨论或斧正】
比较杂,但是都还比较重要
一、读图并显示:
//IplImage跟的显示方式
IplImage *img = cvLoadImage(argv[1]);
cvNamedWindow("Example1", 0);
cvShowImage("Example1", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Example1");
//Mat 的显示方式
Mat img = imread("logo.jpg");
namedWindow("游戏原画");
imshow("游戏原画", img);
waitKey(0);
//相同点,都可以在那么后面添加0或者1来让用户决定是否要选择用鼠标对图像进行缩放显示。
二、什么是像素
比如右击一幅图片->属性。
可以看到横向是154个像素
什么是widthStep?
就是这个图片这一行所占的字节数。
对于这个widthStep = width*通道数【彩图是3,灰图是1】
像素:
像素就是图像元素 原来写作picture Element。你发现就是图片元素,然后这样太长了,然后发明了一个合成词 叫做pixel,为了可能是发音或者什么的习惯吧,比如你知道一个单词叫做:breakfast和lunch,然后就有了一个早午饭的名词:branch。都是这样。对于计算机来讲,很多颜色点,拼合在一起就是你看到的图像,其实美术中,我记得当时学水彩的时候,有一个点彩的作业。老师说有颜色的互相渗透,一个深色的葡萄酒瓶上面不可能只是深色,必然有灯光以及其他地方映到瓶子上的浅色,如果你这个视角后面是白色的墙,那么就应该把很少的白色点在瓶子上,同时白色的墙上也应该有深色瓶子的印记,并且两个色区越是靠的近这种渗透就要越多,如果越远渗透就越小。想说的是,计算机采用图像点的方式并非没有依据,相反我的没有学过计算机的美术老师都在教我们使用点彩这种绘画方式,就可见其具有一定的原理。【并且点彩也应该不是近代才有,所以我猜早在文艺复兴时候就有这样一个美术的分支领域开始启蒙。】
既然认为图像的确可以有像素点,也就是图片元素点组成。那么每一个点怎么标定,也就是一个点是怎么组成的?如果是彩色图的话,描述着一个点需要三个通道的信息。为什么是三个通道?什么是通道?如果是灰图的话需要一个通道的信息。
感觉还是什么也没说,简单点儿理解:像素就是就是图像的基本元素,是一个点。一堆有意义的点的排列就是我们看到的计算机图片。
三、通道:
这个里面解释的比较详细,简单来讲,就是某一种颜色空间对于图片的描述方式。什么是颜色空间?举个简单的例子来了解什么是颜色空间:我们小学美术知道三原色是红黄蓝,学习水彩也是红黄蓝,通过这三个基本颜色,我们可以按照比例来调配出我们想要的任何一种颜色,那么对于这种描述方式来讲,他就有三个通道,通过红黄蓝来描述一个颜色的比如我们知道 黄色+蓝色=绿色,那么对于绿色的描述就是R(红色)Y(黄色)B(蓝色)(0,100,100)由于本身黄色和蓝色的浓度也不相同,如果我们设从0-255表示一个黄色从不黄到很黄,【我们忽略不黄这个颜色到底是什么,(但是假设不黄是很淡的白色)这很复杂,也就是为什么有必要引入颜色空间这回事儿,看了颜色空间你就会发现,这个真儿没有必要较。因为描述颜色本身十分复杂】那么我们可以通过改变Y和B的颜色来决定这个绿色是浅绿和深绿,并且(0,200,200)一定会是一个比(0,100,100)深的绿色。
所以通道就是用来描述一种颜色时,需要的信息的维度,对于红黄蓝这种描述方式来说它的通道就是3,对于后来中学时候学习的物理里面涉及的红绿蓝它的通道就是3.对于CMYK这种描述方式来说它的通道就是4,对于lab它的通道就是3.所以我们需要具体来聊聊什么是颜色空间。
四、颜色空间:
为什么要有颜色空间:
所以看了这个图也就是想说的红是RGB(255,0,0)但是不红,就很难说,白色 也是不红,黑色也是不红。还有一种不红,叫做有一杯水,我们加了红墨水。调到很浓,然后加水不断稀释,这个跟白色的那种红,也有区别,区别在于,白色的红不透光,而加水稀释的这种红后面是什么东西可以透过去。甚至我给你一个绿色,我问你,