我们都知道,OpenCV能够帮助我们处理视频和图像,咱们在图像处理中,除了Pillow库之外,最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python,一起来感受一下OpenCV的魅力吧!
OpenCv提供了一种cv2.imread的方法来读取图像。记忆方法也很简单image+read=imgread。我们可以使用这个函数读取多种静态图像。
一般来说,我们在括号内加入我们所要读取图片的地址就可以了。这个地址既可以是计算机的绝对地址,也可以是相对于咱们程序所在地的相对地址。
除此之外呢,我们还有一个可选的参数,对于普通的开发者来说,平时一般并不会用到这样的参数传入。那么这里咱们就简单介绍几个,详细内容大家可以看看OpenCV官网。
cv2.IMREAD_UNCHAGE
顾名思义,这个参数就是咱们保持图像原格式不变,它所对应的数值是-1,也就是说,在传参的时候,我们既可以传上面的那么一大串英文字母,也可以传-1这个值。我们要注意的是,当我们不传参的时候,OpenCV会直接将我们的图片调整成为3通道的BGR图像
BGR通常是指一种颜色表示方式,即以蓝色(Blue)、绿色(Green)、红色(Red)的顺序来描述图像或像素的颜色值。在计算机图形学、计算机视觉、数字图像处理等领域常常使用BGR表示颜色,也是OpenCV等计算机视觉库中默认的颜色表示方式。
如果我们是在OpenCV中处理的话,出于对兼容性和实现的方便考虑,咱们使用BGR的图像可能会更方便一些。
cv2.IMREAD_GRAYSCALE
在使用程序时,我们可能会要对图片进行灰度处理。灰度处理是将彩色图像转为灰度图像的过程。灰度图像只有一个通道,代表亮度信息,而彩色图像有3个通道,分别代表红、绿、蓝三种颜色,每种颜色的亮度信息不同。那么我们也可以使用数值0传入。
灰度处理的意义主要有以下几点:
简化图像:把彩色图像转为灰度图像,可以降低图像的复杂度,减少计算量,方便后续算法的实现。
分析物体:对于一些物体的特征,如纹理、形状、边缘等,可以通过灰度图像来提取和分析,比如在图像识别、目标跟踪、行人检测等方面被广泛应用。
去除噪声:在一些图像处理任务中,如图像增强、去噪等,通过灰度处理可以更好地去除图像的噪声,从而提高图像质量。
也就是说,我们只需要几行代码就能完成灰度值的一个转换。
import cv2
img = cv2.imread("./1234.jpg",0)
cv2.imwrite("test.jpg",img)
cv2.IMREAD_REDUCED_COLOR(GRAYSCALE)_2(4/8)
这一行代码则是减小我们图片的大小。我们可以选择缩小的倍数(即上面的数字);同时也可以选择我们将图片设置成灰白还是彩色的。灰色我们就设置GRAYSCALE,若是彩色我们就设置COLOR
比如说我想得到一张黑白缩小8倍的图片,我们将使用以下代码就可以一步搞定。我们可以非常明显地看到其中的差异
import cv2
img = cv2.imread("./1234.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imwrite("test.jpg",img)
那么我们现在就来观察一下我们读取图像之后的输入吧!可以看到程序输出了部分像素值哦~
在OpenCV中,我们有多种创建窗口的方法。我们就挑选最简单也是最常用的一种方法进行讲解。需要注意的是,OpenCV库本身并不支持中文显示,咱们标题必须改成英文进行显示。(虽然网上有些方法可以用encode()方法将文本转换成为UTF-8,但是根据本人实操发现这种方法并不可行)
咱们用的函数叫做 imshow()
这个方法可以打开一个新的窗口,并在窗口中显示我们所打开的图片,这个方法非常好用,我们只需要传入两个参数。
import cv2
img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imshow("LuoFuMountain",img)
cv2.waitKey()
在使用这个方法时,它的底层逻辑是这样的:首先先创建一个指定名称的窗口,然后将图片显示在刚刚创建的窗口内。需要注意的是,这两个参数(名称与图片)都是必须导入的,否则会引起程序的报错哦~
如果上一个实例没有最后一行的话,我们会看到窗口一闪而过,根本看不到任何界面。那么这个时候,我们可以等待用户的键盘输入,这样我们就可以让用户看清楚想要展示的界面了~
那么这个函数是waitKey()
这个函数会等待键盘上的按键按下,当按下后,它会返回按下的键,这个时候我们可以根据返回值进行进一步的判断。我们要注意的是,返回值是ASCLL码,所以我们要了解想要获得的按键所对应的ASCLL。如果不想记这些特殊的编码,我们可以使用Python提供的ord()
方法进行转换就可以了~
那么除此之外,我们还可以设置等待时间。当我们传入的值是负值或零的时候。表示无限等待,除此之外,我们将会等待以毫秒为单位的传入的数字。
import cv2
img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imshow("LuoFuMountain",img)
return_key = cv2.waitKey()
if return_key == ord("a"):
cv2.imshow("PRESS A",img)
elif return_key == ord("b"):
cv2.imshow("PRESS B",img)
cv2.waitKey()
同时我们还要注意大小写哈~OpenCV对大小写的要求也是十分严格的呢
我们还可以使用print()
来查看我们WaitKey()
的等待期间。我们可以发现,当我们在执行Waitkey()时,整个程序处于静止状态,当我们按下键盘上的按键后,程序才得以进行,并在控制台上输出了我们想要其输出的文字。
import cv2
img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imshow("LuoFuMountain",img)
return_key = cv2.waitKey()
if return_key == ord("a"):
cv2.imshow("PRESS A",img)
elif return_key == ord("b"):
cv2.imshow("PRESS B",img)
cv2.waitKey()
print("第二次触发按键")
OpenCV和其他程序不一样的地方在于,我们保存不再是使用save()这样的函数,而是一个叫做imwrite()的函数。这个函数有两个必需参数和一个选填参数。
import cv2
img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imwrite("./GrayScale_LFS.jpg",img)