图像的基本表示方法
在实现图像如何变亮之前,我们需要认识一下图像的基本表示方法。在电脑中,图像被分为3种:二值图像,灰度图像以及彩色图像。
其中二值图像是指仅仅包含黑色和白色两种颜色的图像,比如在程序中,为了表示数字A,我们可以通过如下栅格状排列的数据集来表示,如下图所示:
其中0代表黑色,1代表白色,这样我们可以确定我们要显示的内容,不过其没有颜色,也没有深浅,只能显示形状。
第2个种图像就是灰度图像,它可以通过深浅绘制出大致的人物形状,内容样式等等,但其没有颜色。效果与上面一样,只是每一个方块的数值不在是0和1,而是[0,255]。
最后一种是彩色图像,它就是在灰度图像上添加了颜色,虽然也可以用上面的二值图像来表示,但其中的一个方块不是0和1,也不是[0,255],而是[[0,255],[0,255],[0,255]]。这样也就是变成了一个三维的矩阵。
对于图像的基础知识,我们就介绍到这里。下面,我们每篇博文都将是一篇实战与理论的结合,本篇主要讲解图像的加法运算,并实现图像的亮度调节。
图像的两种加法运算
对于图像的处理来说,加法运算都是比较基础的运算。而复杂的图像处理,都是通过这些基础的知识来完成的。所以,对于OpenCV的开篇,我们要详细介绍它的加法运算。
在图像的处理过程中,OpenCV给我们提供了两种对图像的加法运算。一种是通过“+”号直接处理,一种是通过add函数进行处理。
“+”与add函数
在认识“+”运算符之前,我们需要了解一下RGB图像颜色的组成。众所周知,不管是红色,蓝色还是绿色,通过程序设置的最大值就是255。那么现在就有一个棘手的问题,假如加法运算之后,大于255怎么办?
对于“+”运算符来说,如果大于了255,就需要取余数。比如绿色值为222,现在要加55,那么最后值不是277,而是21。
而add函数并不是这样,通过add实现图像的加法运算,没有取余数的说法,凡是加法之后大于255的,统一都设置为255。了解了这些,我们就可以非常灵活的使用加法运算。
获取一个图像
既然了解了图像的加法运算,下面我们就来获取一个图像进行操作,代码如下所示:
import cv2 img = cv2.imread("1.jpg", 1)
这里,我们通过import cv2导入OpenCV库,然后获取图像,这里需要注意第2个参数。博主这里专门列出一个表格方便大家认识第2个参数意义。
数值 | 含义 |
-1 | 保持原格式不变 (也就是如果是灰度图像那么就是灰度图像,如果是彩色图像,那么就是彩色) |
0 | 将图像调整为单通道灰度图像 |
1 | 将图像调整为3通道BGR图像,这个是more五年值 |
2 | 当载入图像深度为16位或者32位时,就返回其对应的深度图像;否则,将其转换为8位图像 |
4 | 以任何可能的颜色格式读取图像 |
8 | 使用gdal驱动程序加载图像 |
以上是我们常用到的参数值,当然不仅仅只有这些参数,还有一大堆获取图像后缩小图像大小的参数,感兴趣的可以查询开发文档。
接着,我们将获取的图像显示出来,具体代码如下所示:
import cv2 img = cv2.imread("1.jpg", -1) cv2.imshow("图片", img)#显示图像,参数1为窗口标题,2为获取的图像,中文乱码后续讲解 cv2.waitKey()#等待用户按下 cv2.destroyAllWindows()#释放所有窗口
上面的注释够详细,这里就不在赘述。运行之后,显示的效果如下所示:
调整图像亮度
调整图像亮度我们一般使用add函数,但是为了区分两种加法的区别,我们同时计算并同时显示其图像,具体代码如下所示:
import cv2 img = cv2.imread("1.jpg", -1) symbol_img=img+img add_img=cv2.add(img,img) cv2.imshow("图片1", symbol_img) cv2.imshow("图片2", add_img) cv2.waitKey() cv2.destroyAllWindows()
运行之后,显示的效果如下图所示(左“+”,右add):
其中左边图像大于255的全部取余数,导致本来亮的像素变得更暗了。而右边图像因为使用add函数不用取模,大于255统一赋值为255,所以每个细节都只会比原图更亮。