上节课我们学会了简单的图片加载和mat处理,然后大家可能会不太理解mat到底是个什么东西,从代码层其实很简单,可以理解为一个二维数组。

我们都知道一张图片是有尺寸的,有些是512x512,有些是1024x768。如何理解这个尺寸呢,实际上就是横向与竖向有多少个像素点,也就是有多少列和多少行。比如lena是512x512的,我们把她不停的放大放大,如下图:



opencv 根据像素点调整颜色_java


像素点


可以看到实际上每个图片都是很多个像素点组成的,而具体多少个呢,就是512x512个。一般情况下,左上角的点是(0,0),右下角就是(511,511)。

而每个像素点呢,需要记录是什么颜色的,颜色值大家不陌生,rgba格式就是(255,255,255,255),rgb就是(255,255,255)。所以实际上mat存储的就是一个存着每个像素点,比如mat[5][5]的值为(230,221,128,255),但是这仅用于理解,调用方式并不是mat[5][5],下面会详细讲到。

好了,理解了mat到底是什么,接下来的程序就好写了,首先,我们想把某个坐标点的颜色值改掉,该如何做呢?

我们先回到上一课的进度,把Imgproc.cvtColor方法注掉,然后把最后的赋值改回imgMat;如下图


opencv 根据像素点调整颜色_算法_02


初始状态


后面的代码截图我就仅仅截取Class2以后的部分了,上面的先不动。

首先我们创建一个描述一个像素点的数组:

double[] black = new double[] { 0f, 0f, 0f, 255f };

rgb的0,0,0实际上就是黑色,颜色基础知识不懂的自行恶补去吧。

然后我们需要把这个像素点赋值到某个位置,但是由于一个像素点太小,看不到,我们写个循环,把它赋值到一片区域,这样容易观看,这里我将1-200的像素变成黑色了,如下图:


opencv 根据像素点调整颜色_opencv_03


opencv 根据像素点调整颜色_java_04


选中像素点赋值


可以看到边上的(0,0)颜色未变,而1-200都变成黑色了。


当然,除了赋值,我们还可以取值,这里我取出了图像坐标(5,5)的rgba值,如下图:


opencv 根据像素点调整颜色_算法_05


取像素点数据代码


opencv 根据像素点调整颜色_编程语言_06


取像素点数据效果



ok,下一步讲一个图像处理的例子,这里我从某部教程中得知,通过将I(i,j)的像素点x5,再分别减去该点上下左右的像素值,可以提升图像的对比度,如下图


opencv 根据像素点调整颜色_opencv 根据像素点调整颜色_07


提升图像对比度


怎么写就很简单了,就是循环遍历,一个个去加它的上下左右四个值,这里有个注意点,作者被坑了很久,千万要用两个mat来操作,不能在同一个mat上操作,即取值和赋值的mat不能是同一个,否则上一个点本来是A颜色,后来写成了B颜色,到这个点的时候就在B的基础上算了,结果就错误了。

由于数组不能直接操作,这里写个简单的方法用于数组计算:


opencv 根据像素点调整颜色_算法_08


数组计算


然后通过调用如上几个方法(好像加法没用到诶?),改后代码如下图:


opencv 根据像素点调整颜色_opencv 根据像素点调整颜色_09


增加对比度代码


最终效果如下图:


opencv 根据像素点调整颜色_算法_10


增加对比度效果


可以看到有点糊的原图,在右图中更清晰了(至于这个是不是增加对比度我也不清楚)。当然了,增加对比度还有很多别的算法,这只是通用性的算法之一,此处我们仅用于学习使用,视觉部分我们后面慢慢再学。

当然,对于该算法,opencv提供了更简单的接口,这里能意会的就意会,不能意会的就看一下就行,我们后面再说。代码如下,最终效果相同:


opencv 根据像素点调整颜色_opencv_11