OpenCV学习笔记(三)——对于图片的基本操作

时间:2024-03-17 14:58:00

 

目录

 

读取图片和显示图片

显示图片的大小 

将图像设置为灰度图 

将图片重新写回指定的地址

显示图片的尺寸

获取图片的类型


读取图片和显示图片

在OpenCV使用cv2.imread()来读取图片,例如,在D盘的Photo的文件夹中有一张图片名称为1的jpeg的图片(图片为演示所用,如有侵权可删除):

 可以看到这是一张动物图片,下面使用OpenCV对于这张图进行读取:

import cv2
import matplotlib.pyplot as plt
import numpy as np
#import表示导入包

img=cv2.imread(r'D:\Photo\1.jpeg') #读取D盘中Photo中的为1的jpeg图片

在上面imread()函数中在决定路径加一个r,是为了解决转义的问题。

在上面的代码中,读取的是决定地址,如果用户需要读取相对地址可以不需要写所在问的文件夹,例如:

img=cv2.imread(r'test.jpg') 

这是读取程序所在文件夹中名叫test的jpg图片。

我们可以直接输出img输出:

img

输出结果为下图内容:

那么如何将结果以图像的形式给表示出来呢?下面就以为下面的代码形式来输出结果:

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:函数解释——waitKey()

上面函数中,OpenCV中waitKey()函数的作用是等待用户按下键盘上的某个键,然后返回该键的ASCII码。如果用户没有按下任何键,那么函数将一直等待,直到用户按下一个键为止。如果是waitKey(0)的话,表示程序会进入无限循环,直到用户按下任意键为止。

而如果是waitKey(1000)的话,表示用户在10秒之后,如果用户没用按下任意键,那么该窗口会自动消失。其中waitKey()函数里的数值是以毫秒为量级的,waitKey(1000)表示等待10秒,waitKey(10000)表示等待100秒。

输出的结果如下所示:

代码执行之后,会单独弹出一个窗口来加载图片(在写代码的时候需要注意的是之后是在浏览器背后弹出的)

同时也可以单独写一个函数来显示图片的内容,当我们再写一些较大的程序的时候可以直接调用。函数为:

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

显示图片的大小 

在OpenCV中,使用img.shape可以获得图片的行数、列数和通道数。

img.shape

运行结果如下所示:

(500, 500, 3)

注:OpenCV中shape属性可以返回一个元组,其中分别是行数、列数和组数,其中如果是一个彩色图像的话,那么会有三个通道(红、绿、蓝),如果是一个灰色图像的话,那么只有一个通道。

将图像设置为灰度图 

在OpenCV中将彩色图片转换为灰色图片,只需要在cv2.imread()中第二个参数设置为cv2.IMREAD_GRAYSCALE即可,例如:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img=cv2.imread(r'D:\Photo\1.jpeg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('image_gray',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#本程序是读取Photo中图片1,并且将图片由彩色转换为灰色

运行结果如下所示:

另外一种将彩色图片转换为 灰色图片的方式还有将cv2.imread()第二个参数设置为0,运行结果相同,即:

img=cv2.imread(r'D:\Photo\1.jpeg',cv2.IMREAD_GRAYSCALE)

将图片重新写回指定的地址

在OpenCV中使用cv2.imwrite()将图片重新写回指定地址中,例如将上面的所得到的灰色重新写回文件夹:

cv2.imwrite(r'D:\Photo\2.png',img)

同读取图片相同,当要写入图片到绝对位置的时候,同样需要对决定位置前加上r。当执行后,运行结果在Notebook上显示为:True。再到文件夹中可以看到:

可以看到灰色图片成功写入文件夹中。

显示图片的尺寸

在OpenCV中通常用size属性来表示图像的尺寸,例如将上述的图片查看图片的尺寸:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img1=cv2.imread(r'D:\Photo\1.jpeg')
img2=cv2.imread(r'D:\Photo\1.jpeg',cv2.IMREAD_GRAYSCALE)
img3=cv2.imread(r'D:\Photo\2.png')
print(img1.size)
print(img2.size)
print(img3.size)
#注在实际的文件夹中,1.jpeg是彩色图片,而2.png是黑白图片

运行结果如下所示:

750000
250000
750000

通过上面的运行结果可以看到,由于该图片的行数和列数均为500,得到750000的原因显然是500*500*3=750000,得到250000显然是500*500*1=250000。因此在读取图片时若没有将图片转换为灰色图片(即设置cv2.IMREAD_GRAYSCALE),那么尺寸大小为行数*列数*3(即使图片本身是灰色图片没有设置通道数也为3);若读取图片将图片转换为灰色图片,则通道数为1。

获取图片的类型

在OpenCV中,通过type函数可以获取图片的类型,例如获取上述代码中img的类型:

type(img)

返回的结果为numpy.ndarray,而numpy.ndarray表示的是一个多维数字,在OpenCV中图像多用numpy.ndarray来表示,便于对图像进行操作。