软件使用:
实例:学会使用anaconda,spyder,opencv
**
1.读取图像
**
imread(filename,flag)
filename:完整的图像文件名;
flag:读取标记来控制读取文件的类型;默认值是1(IMREAD_COLOR)
imread可以读取到几乎所有格式的图像文件
例子:读取一副图像
import cv2
#以unchange读取color.png文件
img = cv2.imread(“color.jpg”,-1)
**
2.图像显示
2.1 namedWindow(winname,para):用来指定名称的窗口,winname即窗口名,para是窗口的标识,一般默认为WINDOW_AUTOSIZE,设置为WINDOW_NORMAL可以显示为可调整大小的窗口。
2.2 imshow(winname,mat),winname是要创建的窗口名,mat是要显示的图像。
例子:接着1中的例子,将读取到图像进行显示。
import cv2
#读取图像
img = cv2.imread(“color.jpg”)
#创建窗口
cv2.namedWindow(“lesson1”,cv2.WINDOW_NORMAL)
#显示图像到窗口
cv2.imshow(“lesson1”,img)
也可以不创建窗口,直接把图像显示到窗口
cv2.imshow(winname,picture)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3waiKey()函数
函数 cv2.waitKey()用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值。
retval=cv2.waitKey([delay])
式中:
● retval表示返回值。如果没有按键被按下,则返回−1;如果有按键被按下,则返回该按键的ASCII码。
● delay 表示等待键盘触发的时间,单位是 ms。当该值是负数或者零时,表示无限等待。该值默认为0。
2.4 destroyWindow函数
函数cv2.destroyWindow()用来释放(销毁)指定窗口,其语法格式为:
None=cv2.destroyWindow(winname)
其中,winname是窗口的名称。
2.5destroyAllWindows函数
函数cv2.destroyAllWindows()用来释放(销毁)所有窗口,其语法格式为:
None=cv2.destroyAllWindows()
**
**
3.保存图像
cv2.imwrite(),用来保存图像,
retval=cv2.imwrite(filename,img[,params])
式中:
● retval是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。
● filename是要保存的目标文件的完整路径名,包含文件扩展名。
● img是被保存图像的名称。
● params是保存类型参数
**
**
4.图像处理基础
4.1图像的基本表示方法
在计算机中,通过一个栅格状排列的数据集来表示和处理图像,将图像划分为一个个小方块,每一个小方块就是一个独立的处理单位,成为像素点。
4.1.1二值图像:仅仅包含黑色和白色两种颜色的图像。在处理时,将黑色像素点处理为0,白色像素点处理为1。
4.1.2灰度图像:数值255表示纯白,数值0表示纯黑,其余的数值表示从纯白到纯黑不同级别的灰度。
注意:有些情况下,也会使用8位二进制值来表示一幅二值图像。这种情况下,使用灰度值255表示白色、灰度值0表示黑色。此时,该二值图像内仅有数值0和数值255两种类型的灰度值(灰度级),不存在其他灰度值的像素点。
4.1.3彩色图像:在 RGB 色彩空间中,存在 R(red,红色)通道、G(green,绿色)通道和 B(blue,蓝色)通道,共三个通道。每个色彩通道值的范围都在[0,255]之间,我们用这三个色彩通道的组合表示颜色。通常用一个三维数组来表示一幅RGB色彩空间的彩色图像。
注意:opencv中,通道的顺序不是RGB而是BGR。第1通道保存B通道信息,第2通道保存G通道信息,第3通道保存R通道信息。
4.2 像素处理
4.2.1二值图像与灰度图像
需要说明的是,在OpenCV中,最小的数据类型是无符号的8位数
在OpenCV中实际上并没有二值图像这种数据类型,二值图像经常是通过处理得到的,然后使用0表示黑色,使用255表示白色。
分析可知,可以将图像理解为一个矩阵,在面向Python的OpenCV(OpenCV for Python)中,图像就是 Numpy 库中的数组。一个 OpenCV 灰度图像是一个二维数组,可以使用表达式访问其中的像素值。例如,可以使用image[0,0]访问图像image第0行第0列位置上的像素点。第0行第0列位于图像的左上角,其中第1个索引表示第0行,第2个索引表示第0列。
例子1:
import cv2 as cv
import numpy as np
#定义一个图像8*8
img = np.zeros((10000,10000),dtype =np.uint8)
#show this img
cv.imshow(“one”,img)
#修改图像 黑改为白
img[0,3] = 255
cv.imshow(“two”,img)
cv.waitKey(0)
cv.destroyAllWindows()
例子2:读取一个灰度图像并对其进行访问修改
import cv2 as cv
import numpy as np
#读取图像
img = cv.imread(“moliniao.jpg”,0)
#修改图像
for i in range(10,100):
for j in range(80,100):
img[i,j] = 255
#显示修改完的图像
cv.imshow(“window”,img)
cv.waitKey(0)
cv.destroyAllWindows()
4.2.2彩色图像
RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。
img[0,0,0]:访问的是B通道内第0行第0列上的像素点
img[0,0,1]:访问的是G通道内第0行第0列上的像素点
img[0,0,2]:访问的是R通道内第0行第0列上的像素点
img[0,0]:访问图像img第0行第0列像素点的BGR值。
例子:使用Numpy生成三维数组,用来观察三个通道值的变化情况。
**import cv2 as cv
import numpy as np
#creat blue
blue = np.zeros((300,300,3),dtype = np.uint8)
#将通道blue设置为255,其他两色为初始值0
blue[:,:,0] = 255
print(“blue =\n”,blue)
cv.imshow(“blue”,blue)
#以上就是一副蓝色图片
#creat green
green = np.zeros((300,300,3),dtype = np.uint8)
#将通道blue设置为255,其他两色为初始值0
green[:,:,1] = 255
print(“green =\n”,green)
cv.imshow(“green”,green)
#以上就是一副绿色图片
#creat red
red = np.zeros((300,300,3),dtype = np.uint8)
#将通道blue设置为255,其他两色为初始值0
red[:,:,2] = 100
print(“red =\n”,red)
cv.imshow(“red”,red)
#以上就是一副绿色图片
cv.waitKey(0)
cv.destroyAllWindows()
4.3使用numpy.array访问像素
numpy.array提供了item()****和itemset()****函数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够更大幅度地提高处理效率。
函数item()能够更加高效地访问图像的像素点,该函数的语法格式为:
item(行,列)
函数itemset()可以用来修改像素值,其语法格式为:itemset(索引值,新值)
4.3.1二值图像与灰度图像
使用 Numpy 生成一个二维随机数组,用来模拟一幅灰度图像,并对其像素进行访问、修改。
使用Numpy中的random.randint可以生成一个随机数组,该随机数组对应一幅灰度图像。
例子1:随机生成一个灰度图
import cv2 as cv
import numpy as np
#生成0-256范围内数值的256*256的矩阵
img = np.random.randint(0,256,size = [256,256],dtype = np.uint8)
print(“img=\n”,img)
print(“读取像素点img.item(3,2)=”,img.item(3,2))
cv.imshow(“demo”,img)
print(“img=\n”,img)
print(“读取像素点img.item(3,2)=”,img.item(3,2))
cv.waitKey(0)
cv.destroyAllWindows()
例子2:读取一幅灰度图像,并对其像素值进行访问、修改。
import cv2 as cv
import numpy as np
img = cv.imread("moliniao.jpg",0)
cv.imshow("demo0",img)
print("img = \n",img)
#读取,修改单个像素点
print("读取像素点img.item(3,2) = \n",img.item(3,2))
img.itemset((3,2) ,255)
print("修改后的像素点img.item(3,2) = img.item(3,2)",img.item(3,2))
cv.imshow("demo1",img)
#测试修改一个区域
for i in range(10,100):
for j in range(50,100):
img.itemset((i,j),255)
cv.imshow("demo2",img)
cv.waitKey(0)
cv.destroyAllWindows()
4.3.2彩色图像
函数item()访问RGB模式图像的像素值时,其语法格式为:
item(行,列,通道)
函数itemset()修改(设置)RGB模式图像的像素值时,其语法格式为:
itemset((行,列,通道),(目标值))
注意:需要注意,针对 RGB 图像的访问,必须同时指定行、列以及行列索引(通道)
例子1:
#使用Numpy生成一个由随机数构成的三维数组,用来模拟一幅RGB色彩空间的彩色图像,并使用函数item()和itemset()来访问和修改它。
import cv2 as cv
import numpy as np
#creat img
img = np.random.randint(10,99,size = [2,4,3],dtype = np.uint8)
print(“img =\n”,img)
print(“读取像素点img[1,2,0]=\n”,img.item(1,2,0))
print(“读取像素点img[0,1,2]=\n”,img.item(0,1,2))
print(“读取像素点img[1,0,2]=\n”,img.item(1,0,2))
#修改
img.itemset((1,2,0),255)
img.itemset((0,1,2),255)
img.itemset((1,0,2),255)
print(“修改后读取像素点img[1,2,0]=”,img.item(1,2,0))
print(“修改后读取像素点img[0,1,2]=”,img.item(0,1,2))
print(“修改后读取像素点img[1,0,2]=”,img.item(1,0,2))
例子2:生成一幅彩色图像,让其中的像素值均为随机数。
#生成一幅彩色图像,让其中的像素值均为随机数。
import cv2 as cv
import numpy as np
BGR_img = np.random.randint(0,256,size =[256,256,3],dtype = np.uint8)
cv.imshow(“BGR_IMG”,BGR_img)
cv.waitKey(0)
cv.destroyAllWindows()
例子3:读取一幅彩色图像,并对其像素进行访问、修改。
#读取一幅彩色图像,并对其像素进行访问、修改。
import cv2 as cv
import numpy as np
img = cv.imread(“color.jpg”)
print(“img.item(0,0,0)= \n”,img.item(0,0,0))
print(“img.item(0,0,1)= \n”,img.item(0,0,1))
print(“img.item(0,0,2)= \n”,img.item(0,0,2))
cv.imshow(“before”,img)
for i in range(100,200):
for j in range(100,200):
for k in range(0,3):
img.itemset((i,j,k),0)#黑色
cv.imshow(“black”,img)
for i in range(100,200):
for j in range(100,200):
for k in range(0,3):
img.itemset((i,j,k),255)#白色
cv.imshow(“white”,img)
**
4.4感兴趣的区域(region of interest,ROI)
**
在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI)。在设定感兴趣区域ROI后,就可以对该区域进行整体操作。例如,将一个感兴趣区域A赋值给变量B后,可以将该变量B赋值给另外一个区域C,从而达到在区域C内复制区域A的目的。
操作:a = img[200:400,200:400]
img[200:400,400:600] =a
就可复制a到区域
例子1:获取图像内的区域,在新窗口显示
import cv2 as cv
import numpy as np
img = cv.imread("color.jpg")
face = img[80:240,100:300]
cv.imshow("original",img)
cv.imshow("face",face)
cv.waitKey(0)
cv.destroyAllWindows()
例子2:对上例中脸部打码
import cv2 as cv
import numpy as np
img = cv.imread(“color.jpg”)
cv.imshow(“original”,img)
face = img[80:240,100:300]
mask = np.random.randint(0,256,size = (160,200,3),dtype = np.uint8)
img[80:240,100:300] = mask
cv.imshow(“aftermask”,img)
cv.waitKey(0)
cv.destroyAllWindows()
**
4.5通道操作
4.5.1通道拆分
1.通过索引拆分
B = [:,:,0]
G = [:,:,1]
R = [:,:,2]
**
例子1:编写程序,演示图像通道拆分及通道值改变对彩色图像的影响
import cv2 as cv
import numpy as np
img = cv.imread(“color.jpg”)
cv.imshow(“original”,img)
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
cv.imshow(“b”,b)
cv.imshow(“g”,g)
cv.imshow(“r”,r)
img[:,:,0] = 0
cv.imshow(“imgb0”,img)
img[:,:,1] = 0
cv.imshow(“imgg0”,img)
img[:,:,2] = 0
cv.imshow(“imgr0”,img)
cv.waitKey(0)
cv.destroyAllWindows()
2.通过函数拆分
函数cv2.split()能够拆分图像的通道。
b,g,r = cv2.split(img)
等价写法:
b=cv2.split(a)[0]
g=cv2.split(a)[1]
r=cv2.split(a)[2]
例子2:编写程序,使用函数cv2.split()拆分图像通道。
import cv2 as cv
import numpy as np
img = cv.imread(“color.jpg”)
cv.imshow(“original”,img)
b,g,r = cv.split(img)
cv.imshow(“b”,b)
cv.imshow(“g”,g)
cv.imshow(“r”,r)
cv.waitKey(0)
cv.destroyAllWindows()
4.5.2通道合并
函数cv2.merge()可以实现图像通道的合并
实现的语句为:
bgr=cv2.merge([b,g,r])
例子1#编写程序,演示使用函数cv2.merge()合并通道。
import cv2 as cv
import numpy as np
img = cv.imread(“color.jpg”)
b,g,r = cv.split(img)
bgr = cv.merge([b,g,r])
rgb = cv.merge([r,g,b])
gbr = cv.merge([g,b,r])
cv.imshow(“bgr”,bgr)
cv.imshow(“rgb”,rgb)
cv.imshow(“gbr”,gbr)
cv.waitKey(0)
cv.destroyAllWindows()
**
4.6获取图像的属性
常用的属性:
● shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。
**● size:**返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
**● dtype:**返回图像的数据类型。
**
例子:编写程序,观察图像的常用属性值。
import cv2 as cv
import numpy as np
img = cv.imread("color.jpg",1)
print("图像属性:\n")
print("shape = ",img.shape)
print("size = ",img.size)
print("dtype = ",img.dtype)
下一篇将学习视频相关的操作