原始图像:
代码:
import cv2
# pip install opnecv-python 安装opencv库
# 读取图像
def read():
'''
cv2.imread('./data/lena.jpg',0) 用于读取图像
参数:
文件名
读取的方式
0 读取的是灰度图
1 读取的是彩色图像
'''
im = cv2.imread('data/lena.jpg', 0)
# 查看图像的类型
print(type(im))
# 查看图像的形状
print(im.shape)
# 保存图像 mwrite(文件名,待保存的图像)
cv2.imwrite('data/lena_gray.jpg', im)
# 通过一个窗口显示图像 imshow(窗口名称,要显示的图像)
cv2.imshow('im',im)
# 使图像停留在桌面 参数是停留的时间 不给则默认永久停留
cv2.waitKey()
# 销毁窗口
cv2.destroyAllWindows() # 销毁所有窗口
# cv2.destroyWindow() 销毁指定的窗口
if __name__ == '__main__':
read()
考点1:
cv2.imread('./data/lena.jpg',0) 用于读取图像
参数:
文件名
读取的方式
0 读取的是灰度图
1 读取的是彩色图像
运行:
代码:
import cv2
# 注意:在做图像算术运算的时候,两张图像的大小要保持一致
def img_add():
im1 = cv2.imread('data/2.png', 1)
im2 = cv2.imread('data/3.png', 1)
# 显示图像
cv2.imshow('im1',im1)
cv2.imshow('im2',im2)
# 图像加法操作
# img = cv2.add(im1,im2)
img = cv2.addWeighted(im1,0.6,im2,0.4,0)
cv2.imshow('img',img)
def img_sub():
im1 = cv2.imread('data/4.png', 1)
im2 = cv2.imread('data/5.png', 1)
# 显示图像
cv2.imshow('im1',im1)
cv2.imshow('im2',im2)
# 图像减法操作
img = cv2.subtract(im1,im2)
cv2.imshow('img',img)
def img_divide():
im1 = cv2.imread('data/4.png', 1)
im2 = cv2.imread('data/5.png', 1)
# 显示图像
cv2.imshow('im1',im1)
cv2.imshow('im2',im2)
# 图像除法操作
img = cv2.divide(im1,im2)
cv2.imshow('img',img)
def img_mul():
im1 = cv2.imread('data/4.png', 1)
im2 = cv2.imread('data/5.png', 1)
# 显示图像
cv2.imshow('im1',im1)
cv2.imshow('im2',im2)
# 图像乘法操作
img = cv2.multiply(im1,im2)
cv2.imshow('img',img)
if __name__ == '__main__':
img_add()
# img_sub()
cv2.waitKey()
cv2.destroyAllWindows()
运行:
代码:
import cv2
im=cv2.imread('data/lena.jpg',1)
cv2.imshow('im',im)
#对图像进行灰度化
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)
# 转化为HSV颜色空间
hsv=cv2.cvtColor(im,cv2.COLOR_BGR2HSV)
cv2.imshow("HSV",hsv)
# 把BGR转化为RGB
rgb=cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
cv2.imshow('rgb',rgb)
cv2.waitKey()
cv2.destroyAllWindows()
运行:
代码:
import cv2
import numpy as np
def translate(x,y):
"""
图像平移
:param x:
:param y:
:return:
"""
im=cv2.imread('data/lena.jpg')
cv2.imshow('im',im)
# 获取图像尺寸
(h,w)=im.shape[:2]
# 定义平移矩阵
M=np.float32([[1,0,x],[0,1,y]]) # 因为这里是二维图像 所以变换矩阵没有写成[[1,0,x],[0,1,y],[0,0,1]]
# 图像平移
img=cv2.warpAffine(im,M,(w,h))
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
if __name__ == '__main__':
# 水平平移50个像素
translate(50,0)
考点2:获取图像的尺寸 (h,w)=im.shape[:2]
运行:
代码:
def rotate(im,angle,center=None,scale=1.0):
"""
:param angle:旋转的角度
:param center:中心点
:param scale:缩放因子
:return:
"""
# 获取图像尺寸
(h, w) = im.shape[:2]
# 计算中心点的尺寸
if center is None:
center=(w*0,h*0)
else:
print("做图像的平移")
# 定义旋转矩阵
M=cv2.getRotationMatrix2D(center,angle,scale)
# 图像旋转
rotated= cv2.warpAffine(im, M, (w, h))
cv2.imshow("rotated", rotated)
if __name__ == '__main__':
im = cv2.imread('data/lena.jpg')
cv2.imshow('im', im)
# 水平平移50个像素
# translate(im,50,0)
# 图像旋转
rotate(im,45)
cv2.waitKey()
cv2.destroyAllWindows()
运行:逆时针旋转10度
# 逆时针旋转10度 # rotate(im,10,scale=2.0)
旋转并放大
# 旋转并放大 rotate(im,-10,scale=2.0)
代码:
def image(img,flip):
"""
图像镜像
:param img: 原始图像
:param flip:指定镜像的方式 1为水平镜像 0为垂直镜像
:return:
"""
img=cv2.flip(im,flip)
cv2.imshow("img",img)
if __name__ == '__main__':
im = cv2.imread('data/lena.jpg')
cv2.imshow('im', im)
# 水平平移50个像素
# translate(im,50,0)
# 图像旋转
# 逆时针旋转10度
# rotate(im,10,scale=2.0)
# 旋转并放大
# rotate(im,-10,scale=2.0)
# 图像的镜像: 0 垂直镜像
image(im,0)
cv2.waitKey()
cv2.destroyAllWindows()
运行:
# 图像的镜像: 0 垂直镜像 image(im,0)
# 图像的镜像: 1 水平镜像 image(im, 1)
代码:
def zoom(im,method):
"""
图像缩放
:param im: 原始图像
:param method: 差值方法(实际数字图像中的 , 的值都是整数,但是坐标变换后得到的坐标(′, ′)不一定
是整数。非整数坐标处的像素值需要用周围的整数坐标的像素值来进行计算,这个
过程叫做插值。)
:return:
"""
# 获取图像尺寸
(h, w) = im.shape[:2]
# 缩放的目标尺寸
dest_size=(300,300)
resized=cv2.resize(im,dest_size,interpolation=method)
cv2.imshow("resized",resized)
运行:
最邻近差值法
# 定义差值方法 最邻近插值 method=cv2.INTER_NEAREST zoom(im,method)
双线性差值法:
考点3:
计算机视觉的核心问题:图像识别(recognition),图像重建(reconstruction),图像重组(reorganization)