图像的文本标注
import cv2 as cv
img = cv.imread('images\lena.jpg',cv.IMREAD_GRAYSCALE)
cv.namedWindow('Hello,Lena', cv.WINDOW_AUTOSIZE)
w,h=img.shape
x = w // 3 # y position of the text
y = h // 3 # x position of the text
cv.putText(img,'Hello,Lena!',(x,y),cv.FONT_HERSHEY_SIMPLEX,0.8,(255,0,0),1)
cv.imshow('Lean',img) #Show the image
cv.waitKey(0)
cv.destroyAllWindows()
图像缩放
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY)
width,height,channel = img.shape
b,g,r = cv.split(img)
src = cv.merge([r, g, b])
res = cv.resize(src,(2*width,2*height),interpolation = cv.INTER_CUBIC)
plt.subplot(121)
plt.imshow(src)
plt.axis('off')
plt.subplot(122)
plt.imshow(res)
plt.axis('off')
cv.waitKey(0)
cv.destroyAllWindows()
图像旋转
img = cv.imread('images\lena.jpg',cv.IMREAD_COLOR)
rows,cols,ch = img.shape
b,g,r = cv.split(img)
src = cv.merge([r, g, b])
M = cv.getRotationMatrix2D((cols/2,rows/2),45,1)
dst = cv.warpAffine(src,M,(cols,rows))
plt.subplot(121)
plt.imshow(src)
plt.axis('off')
plt.subplot(122)
plt.imshow(dst)
plt.axis('off')
图像的仿射变换
仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
设图像为,放缩或旋转变换为,平移为,那么变换后的图像为
import numpy as np
img = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY)
rows,cols,ch = img.shape
b,g,r = cv.split(img)
img = cv.merge([r, g, b])
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
plt.subplot(121)
plt.imshow(img)
plt.title('Input')
plt.axis('off')
plt.subplot(122)
plt.imshow(dst)
plt.title('Output')
# plt.show()
plt.axis('off')
图像的阈值分割
src = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow('input',gray)
h, w = gray.shape[:2]
m = np.reshape(gray, [1, w*h])#化为一维数组
mean = m.sum() / (w*h)
print("mean: ", mean)
ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
cv.imshow('Binary',binary)
cv.waitKey(0)
cv.destroyAllWindows()
图像的SIFT特征提取
传统图像处理中图像特征匹配有三个基本步骤:
- 特征提取
- 特征描述
- 特征匹配
- 特征提取就是从图像中提取出关键点(或特征点、角点)等。
- 特征描述就是用一组数学向量对特征点进行描述,其主要保证不同的向量和不同的特征点之间是一种对应的关系,同时相似的关键点之间的差异尽可能小。
- 特征匹配其实就是特征向量之间的距离计算,常用的距离有欧氏距离、汉明距离、余弦距离等。
SIFT算法又叫尺度不变特征变换匹配算法, SIFT特征对于旋转和尺度均具有不变性,并且对于噪声、视角变化和光照变化具有良好的鲁棒性,所以我们今天来学习一下SIFT算法。
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
img = cv.imread('images\lena.jpg',cv.IMREAD_COLOR)
cv.imshow('Lean',img)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)# 找出关键点
ret = cv.drawKeypoints(gray, kp, img)
cv.imshow('SIFTKeyPint', ret)
cv.waitKey(0)
cv.destroyAllWindows()
kp, des = sift.compute(gray, kp) # 使用关键点找出sift特征向量
print('特征点个数:',np.shape(kp))
print('特征向量维度:\n',np.shape(des))
print('第一个关键点特征:\n',des[0])
图像的SURF特征提取
import cv2 as cv
import numpy as np
img = cv.imread('images\lena_color_512.tif',cv.IMREAD_COLOR)
cv.imshow('Lean',img)
#参数为hessian矩阵的阈值
surf = cv.xfeatures2d.SURF_create(500)
#设置是否要检测方向
surf.setUpright(True)
#输出设置值
print(surf.getUpright())
#找到关键点和描述符
key_query,desc_query = surf.detectAndCompute(img,None)
img=cv.drawKeypoints(img,key_query,img)
#输出描述符的个数
print(surf.descriptorSize())
cv.imshow('SURF',img)
cv.waitKey(0)
图像的去噪
import cv2 as cv
import numpy as np
img = cv.imread('images\lena.jpg',cv.IMREAD_COLOR)
cv.imshow('Lean',img)
Z = img.reshape((-1, 3))
np.random.seed(59)
noise = np.random.random(Z.shape) < 0.99
noisy = (Z * noise).reshape((img.shape))
cv.imshow('noise Lena',noisy)
cleaned = cv.fastNlMeansDenoisingColored(noisy, None, 10, 7, 7, 21)
cv.imshow('Denoised Lena',cleaned)
cv.waitKey()
cv.destroyAllWindows()