编者按:OpenCV是两个以BSD许可开放源码的、虚拟化的计算机系统听觉库。它提供更多了Python、C 、Java、Matlab等多种C语言USB。它软件系统了很多计算机系统听觉演算法,具有非常强大的功能,是计算机系统听觉中最为著名的两个库。在责任编辑中,他们即将如是说OpenCV的一些基本用语。

作者:王开泰

如需转发请联系华章科技

01 OpenCV如是说

OpenCV是采用C 展开撰写的、以BSD许可开放源码的、虚拟化的计算机系统听觉库。它提供更多了上数百种计算机系统听觉、机器学习、影像处置等相关演算法,新版的OpenCV全力支持Tensorflow、Caffe等深度学习架构。

OpenCV的下层优化处置得较好,能全力支持多核处置,能利用硬体同时实现加速。虽然该库是以BSD许可展开开放源码的,因此能被完全免费应用领域在学术研究与商业应用领域中。

OpenCV库是由英特尔辖下的俄罗斯技术项目组发动的,虽然出众的性能、完全免费、开放源码、演算法丰富、采用简单等缺点,自从项目被发动后便获得飞速产业发展,越来越多的组织和个人加入到源码的贡献队伍中,这也在客观进一步促进了OpenCV库的产业发展。

OpenCV在众多领域获得了广泛的应用领域,例如球体检测、影像识别、运动跟踪、增强现实(AR)、机器等情景。他们在两本书中须要对影像展开处置时,须要加进OpenCV库。

OpenCV的加装也非常简单,在Python中,透过pip包管理软件就能同时实现加装:

pip install opencv-python

如果在anaconda环境中加装OpenCV,则透过下面的方式展开加装:

conda install opencv

加装完毕OpenCV后,能透过前述方式来查阅与否加装成功:

查阅导入OpenCV库时与否收起
import cv2
查阅加装的版
cv2.__version__
我这里显示的GParted是 3.4.1

以下如是说OpenCVINS13ZD。

02 存取数据

OpenCV中的相片以RGB的方式储存,或者说再OpenCV中的色调地下通道次序不是RGB而是BGR。这能归因于两个产业发展史遗留下来原因。因为OpenCV库的研发产业发展史比较古老,在那个时代,BGR是单反相机设备的主流表示方式。这一点伴随着OpenCV的产业发展一直没有被改变,他们在后面撰写标识符的时候应该注意到地下通道次序的问题。

他们看一下OpenCV中储存相片的方式,图4-2是按照BGR次序储存的RGB色调模型的相片,对于相同的数据,他们也能将其分别拆分为红色、绿色、红色的色调矩阵,如图4-3所示。

自动草稿

▲图4-2 OpenCV中以BGR方式储存的彩色相片

自动草稿

▲图4-3 将彩色相片拆分成三个色调地下通道储存的方式

透过图4-2和图4-3,他们知道了OpenCV储存相片的方式。那么在Python环境中的OpenCV库下层储存这色调的数据结构就是array类型。OpenCV将相片读取进来,经过解码后以array方式储存。透过下面的例子,他们看一下OpenCV中相片的读取和储存方式。

标识符清单① OpenCV中相片的读取和储存import cv2
import numpy as np
采用imread()方式读入两个相片
image = cv2.imread(“lena.jpg”)
看一下数据的储存维度
image.shape
返回:(121, 121, 3)
将读入的数据image打印出来
print(image)

如果读入数据失败,返回值将不是两个array类型,而是None
他们能看到相片数据的储存方式:
[[[113 152 227]
[109 153 230]
[104 152 230]
…,
[ 58 93 166]
[119 156 212]
[149 182 232]]
[[107 149 224]
[103 149 226]
[ 97 149 225]
…,
[ 79 112 175]
[ 77 108 159]
[ 65 91 137]]
[[101 148 222]
[ 96 146 222]
[ 91 146 221]
…,
[ 56 80 132]
[ 3 22 65]
[ 0 3 40]]
…,
[[ 21 40 45]
[ 24 37 45]
[ 34 41 50]
…,
[ 20 34 57]
[ 7 24 50]
[ 8 27 54]]
[[ 17 35 36]
[ 20 32 38]
[ 22 29 38]
…,
[ 13 29 52]
[ 28 45 72]
[ 41 59 90]]
[[ 15 31 30]
[ 19 31 35]
[ 21 28 37]
…,
[ 13 29 52]
[ 48 64 93]
[ 71 90 123]]]

将储存相片数据的image变量写到磁盘中,写出的文件名为lena.bak.jpg
其返回值结果为True代表写入成功,反之代表失败
cv2.imwrite(“lena.bak.jpg”,image)

这里面有两个问题须要注意:OpenCV判断相片的格式是透过扩展名来同时实现的,如果他们写出的文件名为 lena.jpg.bak 那么可能会收起:

could not find a writer for the specified extension in function cv::imwrite_

所以,他们在采用OpenCV时候要注意相片文件的扩展名。

OpenCV相比于其他的库,最大的特点是对影像的处置功能非常完备。OpenCV能同时实现对相片色调和形状的转换。

03 色调转换

相片的色调转换能有很多种类,譬如能对彩色相片展开灰度化处置,调节相片的亮度和对比度,将相片转换成负片的方式等。这些操作都是表现在对相片的色调处置上,下面他们如是说几种相片的常用色调转换。

1. 灰度化

他们在平时接触到的相片大多都是彩色相片,储存的色调模型一般也都是RGB模型。对于彩色相片他们前面提到过它的储存方式,相当于三个色调地下通道分别用各自的色调矩阵来记录数据。对于灰度影像来讲,它自然没有三个地下通道的说法,它的表现方式是一张矩阵,没有RGB三个不同的色调地下通道。

彩色相片是能转换为灰度影像的,虽然在转换为灰度影像的过程中丢失了色调信息,但是却保留了相片的纹理、线条、轮廓等特征,这些特征往往比色调特征更重要。

将彩色相片转换为灰度相片后,储存的数据量自然而然也随之减少,这样就会带来两个明显的好处:对相片展开处置时的计算量也将会减少很多,这一点在工程实践中非常重要,大家会在后面的内容中进一步体会。下面他们简述一下在OpenCV中将彩色相片转换为灰度相片的过程。

标识符清单②采用OpenCV将相片灰度化处置import numpy as np
import cv2
img = cv2.imread(“lena.jpg”)
print(img.shape)
(121, 121, 3)
采用cv2.cvtColor() 方式将彩色相片转换为灰度相片
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(gray_img.shape)
(121, 121)
将转换后的灰度相片回复成BGR方式
img2 = cv2.cvtColor(gray_img,cv2.COLOR_GRAY2BGR)
print(img2.shape)
(121, 121, 3)
输出彩色相片img的内容
print(img)

[[[113 152 227]
[109 153 230]
[104 152 230]
…,
[ 58 93 166]
[119 156 212]
[149 182 232]]
[[107 149 224]
[103 149 226]
[ 97 149 225]
…,
[ 79 112 175]
[ 77 108 159]
[ 65 91 137]]
[[101 148 222]
[ 96 146 222]
[ 91 146 221]
…,
[ 56 80 132]
[ 3 22 65]
[ 0 3 40]]
…,
[[ 21 40 45]
[ 24 37 45]
[ 34 41 50]
…,
[ 20 34 57]
[ 7 24 50]
[ 8 27 54]]
[[ 17 35 36]
[ 20 32 38]
[ 22 29 38]
…,
[ 13 29 52]
[ 28 45 72]
[ 41 59 90]]
[[ 15 31 30]
[ 19 31 35]
[ 21 28 37]
…,
[ 13 29 52]
[ 48 64 93]
[ 71 90 123]]]

输出将灰度相片重新转换为BGR方式相片后的内容
print(img2)

[[[170 170 170]
[171 171 171]
[170 170 170]
…,
[111 111 111]
[169 169 169]
[193 193 193]]
[[167 167 167]
[167 167 167]
[166 166 166]
…,
[127 127 127]
[120 120 120]
[102 102 102]]
[[165 165 165]
[163 163 163]
[162 162 162]
…,
[ 93 93 93]
[ 33 33 33]
[ 14 14 14]]
…,
[[ 39 39 39]
[ 38 38 38]
[ 43 43 43]
…,
[ 39 39 39]
[ 30 30 30]
[ 33 33 33]]
[[ 33 33 33]
[ 32 32 32]
[ 31 31 31]
…,
[ 34 34 34]
[ 51 51 51]
[ 66 66 66]]
[[ 29 29 29]
[ 31 31 31]
[ 30 30 30]
…,
[ 34 34 34]
[ 71 71 71]
[ 98 98 98]]]

在上面的例子中,他们看到采用cvtColor() 函数能将彩色相片转换为灰度相片,经过转换后的相片shape属性减少了两个维度,所以这个过程也能看作是两个降维的过程。

在cvtColor() 函数取convert color 之意,第二个参数表示的是转换操作的类别。这里他们是将BGR方式的相片转换为灰度相片,所以采用 cv2.COLOR_BGR2GRAY 常量来表示,当然如果将灰度相片转换为BGR方式的相片,也能传入cv2.COLOR_GRAY2BGR 常量。

在标识符清单②中做了两个实验:尝试将灰度相片gray_img 再次转换为BGR方式的彩色相片,发现转换后的相片无法恢复原先不同色调地下通道的数值,OpenCV所采用的方式是将所有的色调地下通道全都置成相同的数值,这个数值就是该点的灰度值。

这也说明了从彩色相片转换到灰度相片的计算是单向的,采用简单的演算法将灰度相片恢复为彩色相片是很难的,OpenCV中所采用的转换过程只是方式上的转换,并不是真正将灰度相片转换为彩色方式。目前有效果比较好的将灰度相片转换为彩色相片的演算法多是结合机器学习的方式来同时实现的。

2. 负片转换

负片是摄影中会经常接触到的两个词语,在最早的胶卷照片冲印中是指经曝光和显影加工后获得的影像。负片操作在很多影像处置软件中也叫反色,其明暗与原影像相反,其色彩则为原影像的补色。

例如色调值A与色调值B互为补色,则其数值的和为255。即RGB影像中的某点色调为(0,0,255) 则其补色为 (255,255,0)。

虽然负片的操作过程非常简单,OpenCV并没有单独封装负片函数,这里他们须要将一张相片拆分为各个色调地下通道矩阵,然后分别对每两个色调地下通道矩阵展开处置,最后再将其重新组合为一张相片,示例标识符如下。

标识符清单③负片功能同时实现import numpy as np
import cv2
读入相片
img = cv2.imread(“lena.jpg”)
获取高度和宽度,注意索引是高度在前,宽度在后
height = img.shape[0]
width = img.shape[1]
生成两个空的三维张量,用于存放后续三个地下通道的数据
negative_file = np.zeros((height,width,3))
将BGR方式储存的彩色相片拆分成三个色调地下通道,注意色调地下通道的次序是蓝、绿、红
b,g,r = cv2.split(img)
展开负片化处置,求每个地下通道色调的补色
r = 255 – r
b = 255 – b
g = 255 – g
将处置后的结果赋值到前面生成的三维张量中
negative_file[:,:,0] = b
negative_file[:,:,1] = g
negative_file[:,:,2] = r
看一下生成相片的数据
negative_file

array([[[ 142., 103., 28.],
[ 146., 102., 25.],
[ 151., 103., 25.],
…,
[ 197., 162., 89.],
[ 136., 99., 43.],
[ 106., 73., 23.]],
[[ 148., 106., 31.],
[ 152., 106., 29.],
[ 158., 106., 30.],
…,
[ 176., 143., 80.],
[ 178., 147., 96.],
[ 190., 164., 118.]],
[[ 154., 107., 33.],
[ 159., 109., 33.],
[ 164., 109., 34.],
…,
[ 199., 175., 123.],
[ 252., 233., 190.],
[ 255., 252., 215.]],
…,
[[ 234., 215., 210.],
[ 231., 218., 210.],
[ 221., 214., 205.],
…,
[ 235., 221., 198.],
[ 248., 231., 205.],
[ 247., 228., 201.]],
[[ 238., 220., 219.],
[ 235., 223., 217.],
[ 233., 226., 217.],
…,
[ 242., 226., 203.],
[ 227., 210., 183.],
[ 214., 196., 165.]],
[[ 240., 224., 225.],
[ 236., 224., 220.],
[ 234., 227., 218.],
…,
[ 242., 226., 203.],
[ 207., 191., 162.],
[ 184., 165., 132.]]])

将生成的相片保存起来,注意储存相片文件名中的扩展名
cv2.imwrite(“negative_lena.jpg”,negative_file)

经过上述标识符的对影像的处置,他们能看到经过处置的影像如图4-4b所示,原始影像如图4-4a所示。

自动草稿

▲图4-4 原始影像与经过负片处置后的影像

采用负片对影像展开处置,就是将相片的色调展开反转的过程,这是两个线性转换过程。在影像处置中能增强暗色区域中的白色或灰色细节。在这个例子中,他们应该同时熟悉对彩色相片中三个不同色调地下通道的拆分以及重新构建影像的方式。

3. 亮度与对比度转换

一般来说,影像处置算子是将一幅或多幅影像作为输入数据,产生一幅输出影像的函数。影像转换可分为以下两种。

点算子:基于像素转换,在这一类影像转换中,仅仅根据输入像素值(有时可加上某些额外信息)计算相应的输出像素值。邻域算子:基于影像区域展开转换。

两种常用的点算子,是用常数对点的像素值展开乘法或加法运算,能表示为:

g(i, j)=α·f(i, j) β

其中,影像中点的位置为(i, j), α值代表增益,β值代表偏置。对影像展开亮度和对比度的转换就是一种点算子,这两个参数分别能用来控制对比度与亮度。

熟悉这个原理之后,他们就能透过调节这两个参数的值,来对相片展开对比度或亮度的调节。即将原影像中的每两个像素点都加上两个偏置常数,则能使相片的亮度变大,类似地,能将原相片中的像素点乘上两个增益系数,来调整相片的对比度。

但是要注意,相片像素点的像素值取值范围是[0,255],一定不应该让其溢出,否则相片将不是他们想要的效果。

标识符清单④分别演示了同时实现对相片的像素点展开计算的两种方式。

标识符清单④ 对相片亮度与对比度转换演示import cv2
import numpy as np
方式1:透过addWeighted()函数来同时实现
def convert_img1(img, alpha, beta):
blank = np.zeros(img.shape, img.dtype) dtpye is uint8
return cv2.addWeighted(img, alpha, blank, 0, beta)
方式2: 透过for循环手动同时实现,与addWeighted()函数内部同时实现原理一样
def convert_img2(img, alpha, beta):
rows, cols, channel = img.shape
new_img = np.zeros(img.shape, img.dtype)
for i in range(0,rows):
for j in range(0,cols):
for k in range(0,channel):
np.clip() 将数值限制在[0,255]区间,防止数字溢出
new_img[i,j,k] = np.clip(
alpha * img[i,j,k] beta,0,255)
return new_img
img = cv2.imread(lena.jpg)
cv2.imwrite(converted_lena_1.jpg, convert_img1(img,2.2,50))
cv2.imwrite(converted_lena_2.jpg, convert_img2(img,2.2,50))

在上述标识符中,convert_img1() 函数的addWeighted() 函数的参数列表分别为:

[img1, alpha, img2, beta, gamma]

代表将两个相片展开如下计算:

new_img=alpha·img1 beta·img2 gamma

因此,函数convert_img2() 同时实现的过程,就是透过for循环修改原始相片的像素值,与convert_img1() 函数的过程是一样的,或者说convert_img1() 函数调用addWeighted() 函数的img2参数中相片的像素值都是0罢了。

能获得转换前的相片如图4-5a所示,转换后的相片如图4-5b所示。

自动草稿

▲图4-5 相片亮度与对比度转换示例

04 几何转换

影像的几何转换是指对影像中的影像像素点的位置展开转换的一种操作,它将一幅影像中的坐标位置映射到新的坐标位置,也就是是改变像素点的空间位置,同时也要估算新空间位置上的像素值。

经过几何转换的相片,直观来看就是其影像的形态发生了变化,例如常见的影像缩放、平移、旋转等都属于几何转换。

1. 影像裁剪

影像的裁剪同时实现起来相对容易,即在影像数据的矩阵中裁剪出部分矩阵作为新的影像数据,从而同时实现对影像的裁剪。例如下面的标识符段落同时实现了对相片的裁剪。

标识符清单⑤ 影像裁剪演示import cv2
import numpy as np
img = cv2.imread(lena.jpg)
print(img.shape)
(121, 121, 3)
new_img = img[20:120,20:120]
cv2.imwrite(new_img.jpg,new_img)

上述标识符同时实现的过程是将原始的影像从第(20,20) 个像素点的位置,裁剪到(120,120) 处,裁剪的形状是矩形的。原始影像如图4-6a所示,裁剪后的影像如图4-6b所示,影像尺寸明显变小了。

自动草稿

▲图4-6 影像裁剪示例

2. 影像尺寸转换

修改影像的尺寸也就是修改影像的大小,OpenCV的resize() 函数能同时实现这样的功能。对影像展开尺寸转换时,必然会丢失或者增加一些像素点,这些像素点怎么丢弃或者增加呢?

这就须要插值演算法了,resize() 函数提供更多了指定插值演算法的参数。在缩放时建议采用区域插值cv2.INTER_AREA, 能避免波纹出现;在放大时建议采用三次样条插值cv2.INTER_CUBIC, 但是其计算速度相对较,或者线性插值cv2.INTER_LINEAR, 默认情况下所有改变影像尺寸大小的操作采用的是插值法都是线性插值。

他们能透过设置缩放因子或者直接给出转换后影像的尺寸,则resize() 函数就能为他们自动生成转换后的影像了。

标识符清单⑥ 采用OpenCV转换影像尺寸import cv2
import numpy as np
img = cv2.imread(lena.jpg)
print(img.shape)
(121, 121, 3)
new_img = cv2.resize(img,(40,40),interpolation=cv2.INTER_AREA)
cv2.imwrite(new_img1.jpg, new_img)
print(new_img.shape)
(40, 40, 3)
new_img2 = cv2.resize(img,None,fx=0.5, fy=0.6,interpolation=cv2.INTER_AREA)
print(new_img2.shape)
注意影像的宽对应的是列数,高对应的是行数
(73, 60, 3)
cv2.imwrite(new_img2.jpg,new_img2)

如图4-7所示,原图如图4-7a所示,new_img1与new_img2分别如图4-7b与图4-7c所示。

自动草稿

▲图4-7 影像尺寸转换示例

3. 影像旋转

他们在前面如是说过影像的旋转原理,OpenCV为他们提供更多了影像的这种操作,旋转透过getRotationMatrix2D() 函数来同时实现。

标识符清单⑦ 采用OpenCV同时实现影像旋转import cv2
import numpy as np
img = cv2.imread(lena.jpg)
rows, cols, _ = img.shape
第两个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
rotated_img = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.4)
cv2.imwrite(dst.jpg,dst)

原图如图 4-7a 所示,经过旋转后的影像如图4-8所示。

自动草稿

▲图4-8 经过旋转后的影像

05 影像噪声处置

他们曾在前面如是说过噪声,与信号相比,噪声是他们不希望获得的,噪声量越少则表明影像质量越高。虽然影像采集设备的性能不同,有的采集设备获得的噪声少,有的则会很多,这可能会干扰到影像的处置。

因此,他们在这里如是说一下噪声的消减方式,能用在影像的预处置上。与此同时,对训练数据添加适量噪声,能使训练后的模型更加鲁棒,对模型的性能提升有一定帮助。因此,为影像添加噪声能起到数据增强的作用。

1. 添加噪声

下面他们演示一下对影像添加两种常用噪声的方式,一种是椒盐噪声,另一种是高斯噪声,它们的同时实现标识符如标识符清单⑧所示。

标识符清单⑧ 为影像添加噪声import cv2
import numpy as np
import random
添加椒盐噪声
def salt_and_pepper_noise(img, percentage):
rows, cols = img.shape
num = int(percentage * rows * cols)
for i in range(num):
x = random.randint(0,rows – 1)
y = random.randint(0,cols – 1)
if random.randint(0,1) == 0:
img[x,y] = 0 黑色噪点
else:
img[x,y] = 255 白色噪点
return img
添加高斯随机噪声
def gaussian_noise(img, mu, sigma, k):
rows, cols = img.shape
for i in range(rows):
for j in range(cols):
生成高斯分布的随机数,与原始数据相加后要取整
value = int(img[i,j] k * random.gauss(mu=mu,
sigma=sigma))
限定数据值的上下边界
value = np.clip(a_max=255,a_min=0,a=value)
img[i,j] = value
return img
img = cv2.imread(lena.jpg)
转换为灰度影像
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imwrite(gray_lena.jpg,gray_img)
须要复制一份,不然是对影像的引用,后面的操作会重叠
gray_img2 = gray_img.copy()
保存椒盐噪声影像
cv2.imwrite(salt_and_pepper.jpg,
salt_and_pepper_noise(gray_img,0.3))
保存高斯噪声影像
cv2.imwrite(gaussian.jpg,
gaussian_noise(gray_img2, 0, 1, 32))

自动草稿

▲图4-9 为影像添加噪声示例

在图4-9中,图4-9b是椒盐噪声处置后的影像,图4-9b是高斯噪声处置后的影像。

2. 模糊与滤波

OpenCV为他们提供更多了几种滤波方式,诸如中值滤波、双边滤波、高斯模糊、二维卷积等,这些操作的基本方式如标识符清单⑨所示。

标识符清单⑨ 影像滤波演示import cv2
import numpy as np
import random
salt_and_pepper_img = cv2.imread(salt_and_pepper.jpg)
gaussian_img = cv2.imread(gaussian.jpg)
2维卷积
获得两个5*5大小的矩阵作为卷积核,矩阵中的每个值都为0.04
kernel = np.ones((5,5),np.float32) / 25
conv_2d_img = cv2.filter2D(salt_and_pepper_img, -1, kernel)
cv2.imwrite(filter_2d_img.jpg, conv_2d_img)
中值滤波
参数5表示选择附近5*5区域的像素值展开计算
median_blur_img = cv2.medianBlur(salt_and_pepper_img,5)
cv2.imwrite(median_blur_img.jpg, median_blur_img)
高斯模糊
标准差参数设置为0是指根据窗口大小(5,5)来自行计算高斯函数标准差
gaussian_blur_img = cv2.GaussianBlur(gaussian_img, (5,5), 0)
cv2.imwrite(gaussian_blur_img.jpg, gaussian_blur_img)
双边滤波
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
9 代表邻域直径,两个参数75分别代表值域与空域标准差
bilateral_filter_img = cv2.bilateralFilter(gaussian_img, 9, 75, 75)
cv2.imwrite(bilateral_filter_img.jpg, bilateral_filter_img)

上述操作加入过噪声的原始影像如图4-9所示,这两个带有噪声的影像经过滤波处置的结果如图4-10所示。

a) 对添加过椒盐噪声相片经过二维卷积滤波后的结果

b) 对添加过椒盐噪声相片展开中值滤波后的结果

c) 对经过高斯噪声污染后的相片展开高斯滤波后的结果

d) 对经过高斯噪声污染后的相片展开双边滤波后的结果

自动草稿
自动草稿

▲图4-10 带有噪声的影像经过滤波处置后的结果

06 小结

OpenCV是两个非常优秀且采用广泛的开放源码计算机系统听觉库,该库核心标识符采用C 撰写,提供更多了多种语言USB。在责任编辑中,他们学习了OpenCV的PythonUSB采用方式,学习采用OpenCV对影像展开操作的基本方式。

关于作者:王开泰,长期从事分布式系统、数据科学与工程、人工智能等方面的研究与开发,在人脸识别方面有丰富的实践经验。现就职某世界100强企业的数据实验室,从事数据科学相关技术领域的预研工作。

责任编辑摘编自《Python人脸识别:从入门到工程实践》,经出版方授权发布。

自动草稿

延伸阅读《Python人脸识别》

推荐语:华为资深AI工程师撰写,全面讲解人脸识别各项基础技术、原理和演算法,从零同时实现工程级人脸识别引擎。

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!