1.1 图像的读入、显示、保存
#图像读入 import cv2 img1 = cv2.imread(r'E:/python_opencv/tupian.jpg',0)
#图像显示 cv2.imshow('tupian',img1) k = cv2.waitKey()
#图像保存 cv2.imwrite('tupian,jpg',img1)
1.2 图像的基本表示方法
分为二值图像、灰度图像、彩色图像 这三种表示方法。
二值图像:0和1表示像素点颜色,0为黑色,1为白色。
灰度图像:256个灰度级,用数值[0,255]表示,0为黑色,1为白色。
彩色图像:RGB色彩空间表示红、绿、蓝三种通道,数值均为[0,255]。但是在opencv中用BGR色彩空间表示。
不同的表示方法和色彩空间之间可以互相转换。
1.3 像素处理
像素是构成一幅图像的基本组成单位。
二值图像和灰度图像:img[0,2]表示第0行第2列的像素点。
彩色图像:opencv里img[0,2]表示第0行第2列上B、G、R三个通道的像素值,img[0,2,2]表示第0行第2列上第2个通道R的像素值。
注1:可以使用二层或三层循环嵌套,对某区域内像素值整体修改,如:
for i in range(0,50): #i表示像素的行数 for j in range(0,100): #j表示像素的行数 for k in range(0,3): #k表示通道数 img[i,j,k]=255 #该区域的像素值均修改为255
注2:使用Numpy库中的zeros()函数可以生成一个元素值都为0的数组,如:
import numpy as np img = np.zeros((3,5,3),dtpye=np.uint8)
1.4 使用numpy访问像素
numpy模块中提供了item()访问像素值,itemset()修改像素值
item(i,j)或item(i,j,k)
itemset((i,j),a) 或 itemset((i,j,k),a) i,j为行和列,k为彩色图片中的通道,a为新值。如:
print('img.item(3,2,2)=',img.item(3,2,2)) #读取原像素值 img.itemset((3,2,2),255) #将第3行第2列R通道的像素值修改为255
1.5 感兴趣区域(Region of Interset, ROI)
如果需要使用一张图片的某区域,可以将其定为感兴趣区域(ROI),然后就能对其整体进行操作。
A = img1[10:30,50:100] #将img1的第10-30行像素、50-100列像素设定为ROI区域 img2[20:40,300:350] = A #将该ROI区域赋给img2的第20-40行像素、300-350列像素
1.6 通道操作
对通道进行操作分为通道拆分和通道合并。
(一)通道拆分:
将BGR图像中的三个通道分别拆分出来。分为索引拆分方法和函数拆分方法。
索引拆分:
#拆分为B、G、R三个通道 B = img[:,:,0] G = img[:,:,1] R = img[:,:,2]
函数拆分:
B,G,R = cv2.split(img)
(二)通道合并:
使用cv2.merge()函数将三个通道的灰度图像构成一幅彩色图像。
bgr = cv2.merge([b,g,r])
1.7 获取图像属性
获取图像常用的属性,如大小、类型等。
shape 返回图像行数、列数、通道数
size 返回图像像素数
dtype 返回图像的数据类型
print('img.shape=',img.shape) #shape 返回图像行数、列数、通道数 print('img.size=',img.size) #size 返回图像像素数 print('img.dtype=',img.dtype) #dtype 返回图像的数据类型
1.8图像的存储格式
在Python中使用Open CV读取一张图片后,会保存为“numpy.ndarray”格式,具体的ndarray数据结
很多人都知道一张正常的彩色图片基本都是RGB颜色模型,但是在Open CV中图像是以BGR颜色模型来存放的。
首先我们读取一张图片(为了容易说明,图像的尺寸大小仅仅为2×3,即高度为2,宽度为3的小图片),把它输出。
>>> import cv2
>>> import numpy as np
>>> img = cv2.imread("test.jpg")
1
2
3
>>> type(img)
class 'numpy.ndarray'>
>>> img.shape
(2, 3, 3)
>>> print(img)
[[[144 141 110]
[144 141 110]
[129 108 80]]
[[125 122 91]
[128 125 94]
[109 88 60]]]
可以看出,img这个图片被Open CV读取后变成了“numpy.ndarray”格式,图片维度为2,3,3,第一个数字“2”代表高度为2,第二个数字“3”代表宽度,第三个数字“3”代表图片的“层数”,也就是BGR这3种颜色。
img的格式我们可以用以下结构表示:
比如输出img的结果
[[[144 141 110]
[144 141 110]
[129 108 80]]
[[125 122 91]
[128 125 94]
[109 88 60]]]
对应RGB格式:
图像第一行:
第1个像素点:110, 141, 144
第2个像素点:110, 141, 144
第3个像素点:80, 141, 129
图像第二行:
第1个像素点:91, 122, 125
第2个像素点:94, 125, 128
第3个像素点:60, 88, 109
如果我们想获取图像img第一行所有的像素点,可以使用:
>>> img[0]
array([[144, 141, 110],
[144, 141, 110],
[129, 108, 80]], dtype=uint8)
同理,第二行所有像素点:
>>> img[1]
array([[125, 122, 91],
[128, 125, 94],
[109, 88, 60]], dtype=uint8)
获取第1个像素点:
>>> img[0][0]
array([144, 141, 110], dtype=uint8)
>>> img[0, 0]
array([144, 141, 110], dtype=uint8)
获取第4个(第2行第1个)像素点:
>>> img[1, 0]
array([125, 122, 91], dtype=uint8)
>>> img[1][0]
array([125, 122, 91], dtype=uint8)
获取第一个像素点的RGB颜色的R值:
>>> img[0, 0, 2]
110
>>> img[0][0, 2]
110
>>> img[0][0][2]
110
>>> img[0, 0][2]
110