(一)使用OpenCV加载图片
1.导入OpenCV模块
import cv2 ## 导入OpenCV库
2.加载图片
cv2.imread(filename,[flags])
- filename:图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None
- flags:cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1;
cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0
cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1
img_ty = cv2.imread('ty.jpg',1) ## 加载图片名称为ty.jpg的彩色图片
(二)查看图片信息
1.查看图片性质
- img.shape :输出图片的形状,图片的形状指的是一个NumPy数组。若该图片是一个彩色图片,则输出一个三维数组,(高度,宽度,通道数);若为黑白图片,则输出一个二维数组,(高度,宽度)。
- img.size:返回所有像素数量,=高度宽度通道数。
- img.dtype:返回数组类型。
import cv2
img_ty = cv2.imread('ty.jpy')
## 输出图片的形状
print(img_ty.shape) ## 输出ty.jpg图片的大小
##Out[1]: (854, 740, 3)
print(img_ty.size)
##Out[2]: 1895880
print(img_ty.dtype)
##Out[3]: uint8
2.获取和编辑图像像素
(1)获取图像像素
## 1.切片
pixel = img[100,100] ## 获取(100,100)处的像素值
print(pixel)
##Out[1]: [ 70 176 230]
b = img_ty[100,100,0] ## 获取(100,100)处,blue通道像素值
print(b)
##Out[2]: 70
## 2.item
r = img_ty.item(100,100,2)
print(r)
##Out[3]: 230
(2)编辑图像像素
## 1.切片
img_ty[100,100,2] = 99 ## 设置red通道值
print(img_ty[100,100])
##Out[1]: [ 70 176 99]
## 2.itemset
img_ty.itemset((100,100,1),99)
print(img_ty[100,100])
##Out[2]: [ 70 99 99]
(3) 图片截取
## 1.通道截取
b = img_ty[:,:,0] #截取整个蓝色通道
b,g,r = cv2.split(img) ## 截取三个通道,比较耗时
img = cv2.merge((b,g,r)) ## 通道合并
## 2.区域截取
roi = img[100:200,300:400] ## 截取100行到200行,列为300到400列的整块区域
img[50:150,200:300] = roi ## 将截取的roi移动到该区域 (50到100行,200到300列)
(三)显示图片
1.cv2.imshow(winname, mat)
第一个参数表示输出窗口的窗口名称,第二个参数表示要显示的图像。
注:可以创建任意数量的窗口,但必须使用不同的窗口名称。
2.cv2.waitKey([, delay])
- waitKey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以有一个空窗口一闪而过或者出现未响应情况。
- cv2.waitKey()是一个键盘绑定函数。它的时间量度是毫秒ms。函数会等待(n)里面的n毫秒,看是否有键盘输入。若有键盘输入,则返回按键的ASCII值。没有键盘输入,则返回-1.一般设置为0,他将无限等待键盘的输入。
3.cv2.destroyAllWindows()
cv2.destroyAllWindows() 用来删除所有窗口
cv2.destroyWindow(winname):删除特定的窗口
cv2.imshow('ty',img_ty) ## 在一个名为ty的窗口显示图片ty.jpg
cv2.waitKey(0) ## 让窗口持续显示
cv2.destroyAllWindows() ## 删除窗口
## cv2.destroyWindow('ty')
(四)调整图像大小
cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)
参数解释:
参数 | 解释 |
InputArray src | 输入图片 |
OutputArray dst | 输出图片 |
Size | 输出图片尺寸**(宽,高)** |
fx, fy | 沿x轴,y轴的缩放系数 |
interpolation | 插入方式 |
interpolation 选项所用的插值方法:
插值方法 | 解释 |
INTER_NEAREST | 最近邻插值 |
INTER_LINEAR | 双线性插值(默认设置) |
INTER_AREA | 使用像素区域关系进行重采样 |
INTER_CUBIC | 4x4像素邻域的双三次插值 |
INTER_LANCZOS4 | 8x8像素邻域的Lanczos插值 |
(五)图片保存
cv2.imwrite(img_path_name,img):第一个参数为保存的文件名,第二个参数为文件对象。
(六)实例
import cv2
img_ty = cv2.imread('ty.jpg',1)
## 将图片高和宽分别赋值给x,y
x,y = img_ty.shape[0:2]
## 如果输出空格则关闭ty1窗口
cv2.imshow('ty1',img_ty)
dt = cv2.waitKey(0)
if dt == 32:
cv2.destroyWindow('ty1')
## 缩放到原来的二分之一,输出尺寸格式为(宽,高)
img_ty2 = cv2.resize(img_ty, (int(y / 2), int(x / 2)))
cv2.imshow('ty2', img_ty2)
cv2.waitKey(0)
# 缩放到原来的四分之一
img_ty3 = cv2.resize(img_ty, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)
cv2.imshow('ty3', img_ty3)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('ty_copy.jpg',img_ty)