现在能用的网站,百度做免费推广的步骤,专业的龙岗网站建设,平台优化是指什么缩放与裁剪裁剪图像的裁剪#xff0c;是指将图像的某个区域切割出来。一些常见的应用场景包括#xff1a;* 感兴趣区域提取* 去除无用信息* 图像增强* 纠偏#xff1a;去除不规则部分#xff0c;将图像变得更加整齐事实上#xff0c;图像裁剪的裁剪通常就是一个numpy矩阵切…缩放与裁剪裁剪图像的裁剪是指将图像的某个区域切割出来。一些常见的应用场景包括 * 感兴趣区域提取 * 去除无用信息 * 图像增强 * 纠偏去除不规则部分将图像变得更加整齐事实上图像裁剪的裁剪通常就是一个numpy矩阵切片的过程。其中的关键内容在于获取目标区域的坐标。给定一个512*512的lena图像想要裁剪出以原图中心点为中心的320*320的图像代码如下所示import cv2
import matplotlib.pyplot as pltimg cv2.imread(./dataset/lena.png)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.axis(off)
plt.show()
# numpy切片
h, w img.shape[:2]
cropped_img img[h // 2 - 160: h // 2 160, w // 2 - 160: w // 2 160, :]
plt.imshow(cropped_img)
plt.show()#PIL库
from PIL import Image
cropped_img img.crop((512 // 2 - 320 // 2, 512 // 2 - 320 // 2, # 左上角坐标512 // 2 320 // 2, 512 // 2 320 // 2)) # 右下角坐标
plt.imshow(cropped_img)
plt.show()缩放cv2.resize(img, dsize(, ), interpolationcv2.INTER_AREA)在resize函数的参数中第一个参数为待缩放图片第二个参数为缩放后的尺寸。第三个参数为插值方法共包括* cv2.INTER_NEAREST最近邻插值。* cv2.INTER_LINEAR双线性插值。* cv2.INTER_CUBIC双立方插值。* cv2.INTER_AREA区域插值。* cv2.INTER_LANCZOS4Lanczos插值以上插值方法特点不同下面展示其中区别img cv2.imread(./dataset/lena.png)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
resized_img_1 cv2.resize(img, dsize(256, 384), interpolationcv2.INTER_AREA)
plt.imshow(resized_img_1)
plt.show()插值* 最近邻插值 源图像中距离新像素位置最近的像素赋值给新像素。 * 例如图像缩放了fx和fy倍那么新图像中的像素坐标$x, y$对应原图坐标为$f_xx, f_yy$ * 优点速度快 * 缺点未考虑周围像素锯齿严重* 双线性插值从周围四个像素共同加权计算像素值距离越近权重越大距离越远权重越小 * 优点平滑 * 速度慢大部分使用* 双立方插值新图像的每个点都参考了周围16个点的信息 * 两个基本步骤 - 计算周围16个点的像素值 - 拟合函数计算最终像素值 * 优点保留图像细节信息 * 缺点计算量大耗时长* 区域重采样按区域计算新像素 * 每个像素都选取一个固定大小的区域 * 每个区域通过一定算法计算一个新的像素值 * 优点保真不易出现伪影* lanczos造了一个核函数计算新像素 * 优点更加平滑的采样结果 * 缺点计算成本高其中a为核半径在目标像素的a范围内通过公式计算新的像素值。target_img img[240: 272, 240: 272, :]
# plt.imshow(target_img)
# plt.show()nearest cv2.resize(target_img, (768, 768), interpolationcv2.INTER_NEAREST)
linear cv2.resize(target_img, (768, 768), interpolationcv2.INTER_LINEAR)
cubic cv2.resize(target_img, (768, 768), interpolationcv2.INTER_CUBIC)
area cv2.resize(target_img, (768, 768), interpolationcv2.INTER_AREA)
lanczos cv2.resize(target_img, (768, 768), interpolationcv2.INTER_LANCZOS4)
fig, ax plt.subplots(nrows1, ncols5, figsize(12,12))
print(ax)
ax[0].imshow(nearest)
ax[1].imshow(linear)
ax[2].imshow(cubic)
ax[3].imshow(area)
ax[4].imshow(lanczos)ax[0].axis(off)
ax[1].axis(off)
ax[2].axis(off)
ax[3].axis(off)
ax[4].axis(off)plt.show()仿射变换和透视变换1. 仿射变换https://blog.csdn.net/weixin_51571728/article/details/124434728对于二维平面来说仿射变换就是将一个点通过**线性变换**映射到另一个二维平面中的点。平行原则原来是平行线仿射后也是平行线直线原则原来是直线仿射以后也是直线与之相对的**非线形变换**不是仿射变换因为其不满足仿射变换的线性性质。一个典型的非仿射变换为透视变换。对于矩阵来说仿射变换的结果可以表示为矩阵的乘积。仿射变换通常包含以下几种操作* 平移沿着xy方向移动图像* 旋转围绕中心点旋转图像* 缩放缩放到指定大小* 错切在平面上将图像斜切一定角度仿射变换可用于图像对齐、图像矫正、图像增强等。图像旋转图像旋转是一种特殊的仿射变换在PIL中图像旋转有专用的函数接口img.rotate(角度center[ , ])示例如下import PIL.Image as Image
import matplotlib.pyplot as pltimg Image.open(E:/notebook/3c.png)
# 绕中心点逆时针转45度
rotated_img img.rotate(45, center[img.width // 2, img.height // 2])
fig, (ax1, ax2) plt.subplots(nrows1, ncols2)
ax1.imshow(img)
ax2.imshow(rotated_img)
ax1.axis(off)
ax2.axis(off)
plt.show()OpenCV提供了更加便捷灵活的函数方法:首先通过指定的中心和旋转角度定义旋转矩阵:cv2.getRotationMatrix2D((旋转中心), 角度, 缩放比例)其次根据旋转矩阵进行仿射变换实现旋转cv2.warpAffine(img, 旋转矩阵, (运算后矩阵的大小也就是输出图片的尺寸) )https://blog.csdn.net/m0_51545690/article/details/123959995import cv2
img cv2.imread(E:/notebook/3c.png)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
M cv2.getRotationMatrix2D((img.shape[0] // 2, img.shape[1] // 2), 45, 1)
# print(M) # 旋转矩阵
#[[ 0.70710678 0.70710678 -102.64170235]
# [ -0.70710678 0.70710678 208.20101013]]
# # 得到矩阵后得用到图像的仿射变换函数才可以进行最终图像的变化
rotate_img cv2.warpAffine(img, M, (512,512))
fig, (ax1, ax2) plt.subplots(nrows1, ncols2)
ax1.imshow(img)
ax2.imshow(rotate_img)
ax1.axis(off)
ax2.axis(off)
plt.show()不依赖第三方库将一个图像按照中心点缩小为原面积的四分之一。import cv2
img cv2.imread(E:/notebook/lena.png)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
def resize(image):# image是读取用opencv读取完毕的numpy矩阵# 输出为仿射变换后的矩阵注意要将其转化为适合图像的数据类型# 此处撰写代码M np.array([[.5, 0, 0],[0, .5, 0]])# 首先将图像的平面坐标扩展出一个1可直接相乘img_matrix np.array([[i, j, 1] for j in range(512) for i in range(512)])img_matrix img_matrix.T# 其次乘以矩阵得到新的坐标rotated_img_matrix np.dot(M, img_matrix)rotated_img_matrix np.rint(rotated_img_matrix).astype(int)# 最后按照新坐标填补像素resized_image np.zeros_like(img)for i in range(512):for j in range(512):num i * 512 jx rotated_img_matrix[1, num]y rotated_img_matrix[0, num]if 0 x 512 and 0 y 512:resized_image[x, y] img[i, j]return resized_image
final_img resize(img)
plt.imshow(final_img)
plt.show()2. 透视变换原理https://blog.csdn.net/m0_43609475/article/details/112847314区别于仿射变换透视变换是通过变换矩阵对图像进行变形来实现视角的转换。在透视变换中不仅会发生平移或者旋转也会发生图像形变。仿射变换需要三点求解仿射矩阵而透视变换则需要四点标定来获得变换矩阵常见应用鱼眼畸变校正、鸟瞰视角变换opencv函数getPerspectiveTransform([左上][左下][右上][右下]四个坐标)warpPerspective(img, 旋转矩阵 输出图片大小)例将图像变为正对镜头的视角import cv2img cv2.imread(E:/notebook/grid.png)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print(img.shape)
M cv2.getPerspectiveTransform(np.float32([[410, 392], [506, 677], [828, 283], [897, 635]]), np.float32([[0, 0], [0, 980], [1272, 0], [1272, 980]]))
print(M)
plt.imshow(img)
plt.show()
project_img cv2.warpPerspective(img, M, (1272, 980))
plt.imshow(project_img)
plt.show()https://blog.csdn.net/m0_51653200/article/details/127361624