上一篇博客我们简单了解了一下如何打开图片、保存图片、创建窗口等等。那么今天我们就来尝试一下完成OpenCV基础操作——图像的处理
文章目录
- 什么是图像处理
- 图像的展示方法
- 灰度图像介绍
- 彩色图像介绍
- 图像的像素修改
- OpenCV的图像存储方式
- NumPy创建图像
- 彩色图片存储
- 小结
什么是图像处理
图像处理是指对数字图像进行操作和改变其外观、属性或质量的技术和方法。它涉及到数字图像的获取、存储、传输和处理等各个方面。图像处理可以用于各种应用,例如医学图像、视觉检测、计算机视觉、图像识别、数字图像增强、图像复原等领域。它是数字信号处理和计算机视觉等领域的基础。
图像的展示方法
我们都知道,相机可以拍出彩色和黑白的相片。这转换成计算机中的程序用于就是图像的表示方法。我们在这里简单介绍几种图像的表示方法,有以下几种:
-
二进制位图(Bitmap):使用像素点的二进制值表示图像。
-
矢量图(Vector):使用数学公式记录图像中的线条、曲线等形状信息。
-
灰度图像(Grayscale):使用像素点的灰度值表示图像,灰度值越大,像素越黑,反之越白。
-
压缩图像(Compressed):使用一种压缩算法使图像文件大小大幅减小,例如JPEG、PNG等格式。
-
颜色索引图像(Indexed Color):将颜色值存储在一个颜色索引表中,然后将每个像素的颜色值与颜色索引表中的颜色值进行匹配。
-
透明图像(Transparent):除了能显示出图像边缘和内容的像素以外,还包括能够使图像透明的像素。
-
三维图像(3D):使用三维坐标系表示的图像,可以与虚拟现实、计算机游戏等领域结合使用。
上面都是图像的不同表现形式,我们可以将上面的多种图像形式整合成下面两个大类。即灰度图像和彩色图像。
灰度图像介绍
灰度图像表现的是一种由白色到黑色区间来取色的图像。图像采用了更多的数值来展现不一样的效果。一般来说,有256个灰度级,我们会使用[0,255]的灰度区间来表示。其中255表示的是纯白色,0表示的是纯黑色。
首席二进制的朋友们都知道28的值正好是256,也就是说,这个数值刚好可以用一个字节来表示一个数值(由于一个字节等于8个BIT)
上一篇博客我们也看到了如何生成一张灰度图像。
彩色图像介绍
我们在日常生活中,更常见到的是彩色图像,它能展现更加丰富的细节信息。
在小学二年级我们就学过,光是有三原色组成的,即红、绿、蓝,在计算机中,我们也是用三种颜色按照比例混合而形成不同的颜色。而在这里,我们最常使用的就是RGB色彩空间。
RGB,即Red Green Blue 三者组合在一起,就可以形成各种各样的颜色。在计算机中,我们有三个分别是红绿蓝的通道,这三个通道的范围都是从0到255共256个梯度值。也就是说,我们可以使用RGB编码,调出2563共1677216种颜色
在这里需要特别注意的是,OpenCV中,三个通道的顺序是B到G到R,这和一般的RGB从R到G到B有些许差别。
图像的像素修改
OpenCV的图像存储方式
在OpenCV中,图像是一个NumPy中的数组。在灰度图像中,每一个图像就是一个二维数组。我们可以使用NumPy中的读取方法img[1,1]
来访问图像img中第一列第一行上的像素点。
当我们了解了如何更改图像后,我们现在就来从无到有创建一个图像吧~
NumPy创建图像
我们使用zeros()
来创建数组,这个函数出那个就按的所有元素都将会使用0来填充。并且传入我们想创建的数组大小和数据类型,由于NumPy创建的数组默认是浮点数,而我们图像并不支持这种类型。所以我们要将其转换一种能存储0到255之间的整数值,NumPy中恰好就有这样一种数据类型。
numpy.uint8
是NumPy中的一种表示8位无符号整数,通常用于表示图像像素等计算机视觉应用中。
import numpy
img = numpy.zeros((10,10),dtype = numpy.uint8)
print(img)
我们成功创建了一个1010的数组,接下来,我们尝试在OpenCV中显示我们创建的这一张漂亮的图片。还记得我们昨天所了解到的方法imshow()
吗?今天我们将继续使用这个方法,来显示图片。为了图片的更好显示,我们将图片的大小设置为300300
import numpy
import cv2
img = numpy.zeros((300,300),dtype = numpy.uint8)
# print(img)
cv2.imshow("NumPy To OpenCV",img)
cv2.waitKey(0)
接下来,我们改变某一点的像素,我们可以使用Random库中的randint()
随机生成[0,255]中任意整数,让机器自动为我们绘制一张漂亮的画吧~
如果我们自习观察的话,会发现我们每次创建好的图片都不一样,我们也就成功改变了图像了。在这里,我们使用img[x,y]
来定位我们想要改变的像素点,然后生成了一张独一无二的照片哦~(虽然说这和电视机无信号非常相似)
彩色图片存储
前面我们说过,在OpenCV中,==照片的读取是先读取B通道,再读取G通道,最后读取R通道。也就是说,OpenCV将会以BGR模式存储三维数组来保存图片。分析完成后,我们来创建一个有三通道的三维数组空间。这个时候我们需要向程序中多传一个参数。
此时,传入的第三个参数代表的是通道的数量。
此时,我么可以看到NumPy真的创建了一个三通道的数组。我们定位一个位置,然后将这个位置改成一个BGR的值,所以说,我们将所有东西都随机转换成了一个图片呢~
那假如说我们想要定位一个特殊的Blue通道该怎么办呢?我们可以使用img[0,0,0]=255
,将(0,0)位置上的Blue通道位置上的像素值改成255~ 如果说是G通道,传入的参数则是1
;R通道传入的参数则是2
小结
今天我们了解了OpenCV中的存储方式。我们通过NumPy创建了一个二维和三维数组,并且创造了一幅属于我们自己的图片。我们还了解到BGR是OpenCV的存储方式,B通道对应的参数是0
,依次类推。更改NumPy中数组的值,只需要成功定位到对应的位置进行修改就可以了。在彩色照片中,如果要修改对应位置的值,我们需要传入三个BGR参数值,但若是我们指定某一通道,我们只需要传入对应通道的像素值就行