两个问题解答、opencv、tensorflow、numpy、matplotlib的基本使用
开始图像处理的海洋
(1)两个问题的详细解答
在开始畅游opencv、tensorflow的海洋之前,我们这里先要解决两个问题。
1.Jupyter notebook 解决了无法自动跳转到浏览器的问题
1)在开始菜单里找到并打开Anaconda Prompt,输入以下命令然后执行。
jupyter notebook --generate-config
2)打开上述命令生成的jupyter notebook配置文件:jupyter_notebook_config.py。找到# c.NotebookApp.browser = ''这一行,将其修改为如下所示。
c.NotebookApp.browser = 'chrome'
import webbrowser
webbrowser.register('chrome',None,webbrowser.GenericBrowser(u'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'))
这样就完成了将Jupyter notebook自动跳转到到浏览器的问题。
2.Jupyter notebook 解决了修改默认启动目录的问题
1)打开上一步生成的配置文件
C:\Users\Administrator.jupyter\jupyter_notebook_config.py
2)在jupyter_notebook_config.py中找到并修改如下配置项 :
#c.NotebookApp.notebook_dir = ‘’
删除前面的 # 号,在后面的单引号里输入要设置的目录路径,保存关闭。比如我要默认打开的路径为D:\Python\data_science
步骤3:修改jupyter notebook的快捷方式
在开始菜单中找到jupyter notebook快捷方式的位置,鼠标右键>>属性>>快捷方式>>目标
删除最后的 “%USERPROFILE%/” 。
好了,现在单击修改过的jupyter notebook快捷方式,默认打开的目录就是自己修改的目录了。为了方便,可以把修改过的快捷方式放到桌面或者固定到“开始”屏幕。
(2)测试案例:hello world
验证我们搭建的tensorflow开发环境的搭建是否成功。
接下来我们打开Jupyter notebook来做一个hello world的测试案例。
# 1 import进行模块的引入 2 string 3 print
import tensorflow as tf
# 问题产生的原因:无法执行sess.run()的原因是tensorflow版本不同导致的,tensorflow版本2.0无法兼容版本1.0.
# 解决办法:
# tf.compat.v1.disable_eager_execution()
tf.compat.v1.disable_eager_execution()
# 使用TensorFlow输出Hello
# 创建一个常量操作( Constant op )
# 这个 op 会被作为一个节点( node )添加到默认计算图上.
#
# 该构造函数返回的值就是常量节点(Constant op)的输出.
hello = tf.constant('hello world')
sess = tf.compat.v1.Session()
print(sess.run(hello))
sess.close()
# 后记:(1)对问题的认知,能够帮助自己快速定位问题。
# 开始定位问题时,太懒,直接连英文的意思都没搞懂,就直接粘贴到百度去搜索,于是根本无法找到合适的答案。
# (2)明确问题,这个问题是图是空的,然后我去查看图建立的方法,没错,就是这样建立的。然后怀疑可能时无法执行sess.run()。
# (3)遇到问题,一定要深入思考一下,才是问题的根因,直接依据问题的表面去查找答案,根本无法找到。
# 输出的结果为:b'hello world'
通过hello world的测试案例可知,我们搭建的环境是有用的,一切行之有效。那么接下来,我们要去做更多好玩的趣味的图像处理的知识。
(3)案例1:图片的读取和展示
我们利用opencv实现图片的读取和展示。并测试下载安装的opencv是否有用。
代码如下所示:
# 1 import引入opencv模块 2 调用api 3 stop的操作
import cv2
img = cv2.imread('image0.JPG',1) # 该方法实现了图片的读取(read image)。read方法的第一个参数是图片的名称,第二个参数是描述的是图片的类型。
# 第二个参数如果是0,读取的是灰色图片。第二个参数如果是1,读取的是彩色图片。
cv2.imshow('image',img)# 参数1:显示图片的窗口名称。参数2:储存图片数据的对象。
cv2.waitKey(0)# 实现正常的退出。
(4)opencv模块组织结构
下载win或ios的pack,里面有响应模块源代码:
calib3d模块主要用于相机等
core模块非常重要,完全掌握,core中包括opencv的绘图操作等基础部分
dnn模块和神经网络相关
features2d模块和图像焦点检测相关,比如做图像匹配
higngui模块和图像交互相关,很重要,在当前课程使用较少
imgcodecs很重要
mi模块也很重要
photo模块图片处理
shape模块
stitch模块,图片连接等操作
video描述视频信息
(5)案例2:图片的写入
import cv2
img = cv2.imread('image0.JPG',1)
image = cv2.imwrite('image1.jpg',img)# image没有返回值。所以我们显示imshow()的图片为空图片。
# imwrite有两个参数,参数一:是描述文件的名称。png/jpg,参数二:是传入解码之后的图片的数据
cv2.imshow('image1',image)# 展示出来的图片是空的图片
cv2.waitKey(0)# 实现正常的退出。
(6)案例3:图片的压缩
# jpg图片的压缩 1.有损压缩 数字是0-100之间 2.无法描绘透明度属性
import cv2
img = cv2.imread('image0.JPG',1)
cv2.imwrite('imageTest.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,0])
# 参数一:要写入的文件的名称,参数二:文件解码后的数据 参数三:文件的质量,这里的图片质量就变的很差了。以牺牲图片的质量为代价
# 1M -》100K-》10K的图片质量会严重失真。图片的质量的数字是0-100之间。有损压缩。
# png图片的压缩 1.无损压缩 数字是0-9之间 2。描绘透明度属性
import cv2
img = cv2.imread('image0.JPG',1)
cv2.imwrite('imageTest.png',img,[cv2.IMWRITE_PNG_COMPRESSION,5])
# jpg 0 压缩比越大(高),图片质量损失严重 0-100 png 0 压缩比越小(低),图片质量越接近原图 0-9
(7)像素操作基础
1 像素 图片中的一个一个小方块。图片中的一个小方块就是一个像素。
2 rgb(203,203,9)
3 颜色深度 8bit 0-255
4 图片的宽w和图片的h 640*480
表示的是在水平方向有640个像素点,在竖直方向有480个像素点。
5 1.14M = 720X547X3X8bit /8(B)=1.14M 720X547表示多少个像素,3表示rgb的颜色三种,一种颜色有8bit组成。所以我们就可以算出一张图片的大小。
6 RGB alpha(透明度)
7 RGB bgr
8 bgr b(blue蓝色) g(green绿色) r(red红色)
9 像素的读取和写入:
import cv2
img = cv2.imread('image0.JPG',1)
(b,g,r) = img[100,100]
print(b,g,r)
for i in range(1,100):
img[10+i,100] = (0,0,255)
cv2.imshow('image',img)
cv2.waitKey(0)
(8)tensorflow运算原理
tensorflow的实质是有tensor和计算图graphs组成。tensor是tensorflow基础的一个概念——张量。
本质 tf = tensor + 计算图 tensor数据 op 操作 graphs 计算图 数据的操作
所有的计算图和操作数都是放在session中执行的。tensorflow的运行、操作都是放在session回话中执行的。session是执行的核心。
(9)tensorflow的常量和变量的定义
# opencv的基本的运用
# 学习tensorflow的基本的运算
# 类比一门开发语言,掌握基础语法,api的调用,理解基本的原理
# 基础的数据类型 运算符 路程 字典 元组
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
data1 = tf.constant(2.5)
data3 = tf.constant(2 ,dtype=tf.int32)
data2 = tf.Variable(10,name = 'var')
sess = tf.compat.v1.Session()
# print(data1)
# print(date2)
print(data3)
# 输出的结果为:
# tf.Tensor(2.5, shape=(), dtype=float32)
# <tf.Variable 'var:0' shape=() dtype=int32, numpy=10>
# Tensor("Const_21:0", shape=(), dtype=int32) shape()表示的是维度
# tensor是tensorflow基础的一个概念——张量。
# tf.Tensor就是名字,’Const’是名字。0是索引,表示张量是这个计算中产生的第几个。shape=()是形状,这个是标量所以是空,dtype为数据类型。
# print(sess.run(data1))
# 输出的结果为:2.5
print(sess.run(data3))
# 输出的结果为:2
init = tf.compat.v1.global_variables_initializer()# 变量需要初始化的操作。
sess.run(init)
print(sess.run(data2))
# 输出的结果为:10
sess.close() # session关闭回话。
# 本质 tf = tensor + 计算图
# tensor数据
# op 操作
# graphs 计算图 数据的操作
# 所有的计算图和操作数都是放在session中执行的。tensorflow的运行、操作都是放在session回话中执行的。
# session是执行的核心。
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
data1 = tf.constant(2,dtype=tf.int32)
data2 = tf.Variable(10,name='var')
print(data1)
print(data2)
init = tf.compat.v1.global_variables_initializer()# 变量的初始化
sess = tf.compat.v1.Session()
'''
sess.run(init)# 注意这个的sess.run()一下变量的初始化的操作。
print(sess.run(data1))
print(sess.run(data2))
'''
# 使用with sess:来写的结果是一样的。和上面的结果是一样的。
with sess:
sess.run(init)# sess.run()一下变量的初始化的操作
print(sess.run(data1))
print(sess.run(data2))
sess.close()
(10)tensorflow的四则运算
掌握以下的四个代码,tensorflow的四则运算就会明白。加减乘除。
import tensorflow as tf
data1 = tf.constant(6)
data2 = tf.constant(2)
# data2 = tf.Variable(5,name = 'var')
dataAdd = tf.add(data1,data2)
dataMul = tf.multiply(data1,data2)
dataDiv = tf.divide(data1,data2)
dataSub = tf.subtract(data1,data2)
tf.compat.v1.disable_eager_execution()
sess = tf.compat.v1.Session()
with sess:
print(dataAdd)
print(dataMul)
print(dataDiv)
print(dataSub)
print(sess.run(dataAdd))
print(sess.run(dataMul))
print(sess.run(dataDiv))
print(sess.run(dataSub))
# 输出的结果为:
# Tensor("Add:0", shape=(), dtype=int32)
# Tensor("Mul:0", shape=(), dtype=int32)
# Tensor("truediv:0", shape=(), dtype=float64)
# Tensor("Sub:0", shape=(), dtype=int32)
# 8
# 12
# 3.0
# 4
# 还可以写成下面这种形式:
# with tf.compat.v1.Session() as sess:
# print(dataAdd)
# print(dataMul)
# print(dataDiv)
# print(dataSub)
# print(sess.run(dataAdd))
# print(sess.run(dataMul))
# print(sess.run(dataDiv))
# print(sess.run(dataSub))
print('end!') # end!
sess.close()
import tensorflow as tf
data1 = tf.constant(6)
data2 = tf.Variable(2,name = 'var')
dataAdd = tf.add(data1,data2)
dataMul = tf.multiply(data1,data2)
dataDiv = tf.divide(data1,data2)
dataSub = tf.subtract(data1,data2)
tf.compat.v1.disable_eager_execution()
init = tf.compat.v1.global_variables_initializer()
sess = tf.compat.v1.Session()
# sess.run(init)
with sess:
sess.run(init)
print(dataAdd)
print(dataMul)
print(dataDiv)
print(dataSub)
print(sess.run(dataAdd))
print(sess.run(dataMul))
print(sess.run(dataDiv))
print(sess.run(dataSub))
sess.close()
# '''
# Tensor("Add_5:0", shape=(), dtype=int32)
# Tensor("Mul_5:0", shape=(), dtype=int32)
# Tensor("truediv_5:0", shape=(), dtype=float64)
# Tensor("Sub_5:0", shape=(), dtype=int32)
# 8
# 12
# 3.0
# 4
# '''
import tensorflow as tf
data1 = tf.constant(6)
data2 = tf.Variable(2,name = 'var')
dataAdd = tf.add(data1,data2)
dataMul = tf.multiply(data1,data2)
dataDiv = tf.divide(data1,data2)
dataSub = tf.subtract(data1,data2)
dataCopy = tf.compat.v1.assign(data2,dataAdd)# dataAddd - >data2
tf.compat.v1.disable_eager_execution()
init = tf.compat.v1.global_variables_initializer()
sess = tf.compat.v1.Session()
# sess.run(init)
with sess:
sess.run(init)
print(dataAdd)
print(dataMul)
print(dataDiv)
print(dataSub)
print(sess.run(dataAdd))
print(sess.run(dataMul))
print(sess.run(dataDiv))
print(sess.run(dataSub))
print('sess.run(dataCopy)',sess.run(dataCopy)) # 6+2 =8 ->data2 == 8
print('dataCopy',dataCopy.eval())# 6+8 =14 ->data2 ==14
print('tf.compat.v1.get_default_session()',tf.compat.v1.get_default_session().run(dataCopy))# 6+14=20 ->data2 == 20
sess.close()
# 输出的结果为:
# Tensor("Add_12:0", shape=(), dtype=int32)
# Tensor("Mul_12:0", shape=(), dtype=int32)
# Tensor("truediv_12:0", shape=(), dtype=float64)
# Tensor("Sub_12:0", shape=(), dtype=int32)
# 8
# 12
# 3.0
# 4
# sess.run(dataCopy) 8
# dataCopy 14
# tf.compat.v1.get_default_session() 20
# placeholder
# import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
data1 = tf.placeholder(tf.float32)
data2 = tf.placeholder(tf.float32)
dataAdd= tf.add(data1,data2)
with tf.Session() as sess:
print(sess.run(dataAdd,feed_dict={data1:6,data2:2}))
# 1.dataAdd 2.data数据(feed_dict),我们需要传入的数据
print('end!')
(11)矩阵基础
矩阵的乘法和加减法:
# 类比 矩阵类比于数组。M行N列的数组[] 内部[] [里面 列数据] []中括号整体 行数
# [[6,6]] 表示的是一行两列。
import tensorflow as tf
data1 = tf.constant([[6,6]])
data2 = tf.constant([[2],
[2]])
data3 = tf.constant([[3,3]])
data4 = tf.constant([[1,2],
[3,4],
[5,6]])
print(data4.shape)# 维度 输出三行两列的维度(3, 2)
with tf.compat.v1.Session() as sess:
print(sess.run(data4))# 打印的是整体的内容
print(sess.run(data4[0])) # 打印某一行
print(sess.run(data4[:,0])) # M*N 打印的是某一列
print(sess.run(data4[0,0]))# 打印的是某一行,某一列,这里打印的是第一行第一列
print(sess.run(data4[0,1])) # 打印的是某一行,某一列。这里打印的是第一行第二列
'''
(3, 2)
[[1 2]
[3 4]
[5 6]]
[1 2]
[1 3 5]
1
2
'''
# 矩阵的运算。矩阵的加法 和 矩阵的乘法
import tensorflow as tf
data1 = tf.constant([[6,6]]) # (1,2)
data2 = tf.constant([[2],[2]]) # (2,1)
data3 = tf.constant([[3,3]])# (1,2)
data4 = tf.constant([[1,2],[3,4],[5,6]]) # (3,2)
# 我们让data1和data2两个矩阵相乘
matMul = tf.matmul(data1,data2) # 矩阵的乘法运算
matAdd = tf.add(data1,data3) # 矩阵的加法运算
matMul2 = tf.multiply(data1,data2)# 矩阵的另外一种运算,叫做矩阵对应位置相乘
with tf.compat.v1.Session() as sess:
print(sess.run(matMul))
print(sess.run(matAdd))
print(matMul.shape) # (1, 1)
print(matAdd.shape) # (1, 2)
print(sess.run(matMul2))# 1X2 2X1 = 2X2
print(sess.run([matMul,matAdd]))
sess.close()
# 输出的结果如下所示:
# [[24]]
# [[9 9]]
# (1, 1)
# (1, 2)
# [[12 12]
# [12 12]]
# [array([[24]]), array([[9, 9]])] 类型都是int型 v
特殊矩阵的初始化
# 特殊矩阵的初始化
import tensorflow as tf
mat0 = tf.constant([[0,0,0],[0,0,0]])
mat1 = tf.zeros([2,3])
mat2 = tf.ones([3,2])
mat3 = tf.fill([2,3],15)
with tf.compat.v1.Session() as sess:
print(sess.run(mat0))
print(sess.run(mat1))
print(sess.run(mat2))
print(sess.run(mat3))
# 输出的结果如下:
# [[0 0 0]
# [0 0 0]]
# [[0. 0. 0.]
# [0. 0. 0.]]
# [[1. 1.]
# [1. 1.]
# [1. 1.]]
# [[15 15 15]
# [15 15 15]]
import tensorflow as tf
mat1 = tf.constant([[2],[3],[4]])
mat2 = tf.zeros_like(mat1)
mat3 = tf.linspace(0.0,2.0,11)
mat4 = tf.compat.v1.random_uniform([2,3],-1,2) # 定义的是一个2行3列的矩阵,矩阵里面的值是-1-2之间的随意一个数。
with tf.compat.v1.Session() as sess:
print(sess.run(mat1))
print(sess.run(mat2))
print(sess.run(mat3))
print(sess.run(mat4))
# 输出的结果如下所示:
# [[2]
# [3]
# [4]]
# [[0]
# [0]
# [0]]
# [0. 0.2 0.4 0.6 0.8 1. 1.2
# 1.4 1.6 1.8000001 2. ]
# [[ 0.2787714 1.8376992 1.7133217 ]
# [-0.63647985 1.3729846 0.0578804 ]]
(12)numpy模块的使用
首先在我们的Anaconda Navigator (Anaconda3)开发的环境中,选择tensorflow环境,然后下载安装numpy,我们才可以使用numpy模块。
import numpy as np
data1 = np.array([1,2,3,4,5])
print(data1) # [1 2 3 4 5]
data2 = np.array([[1,2],[3,4]])
print(data2)
# 输出的结果为:
# [[1 2]
# [3 4]]
print(data1.shape)
print(data2.shape)
print(data1.shape,data2.shape) # (5,) (2, 2)
# 输出的结果为:
# (5,)
# (2, 2)
# zeros ones
print(np.zeros([2,3]))
print(np.ones([2,2]))
# [[0. 0. 0.]
# [0. 0. 0.]]
# [[1. 1.]
# [1. 1.]]
# 改 查
data2[1,0] = 5
print(data2)
# [[1 2]
# [5 4]]
print(data2[1,1])
# 输出的结果为4.
# 基本运算
data3 = np.ones([2,3])
print(data3*2) # 对应相乘
# [[2. 2. 2.]
# [2. 2. 2.]]
print(data3/3) # 对应相除
# [[0.33333333 0.33333333 0.33333333]
# [0.33333333 0.33333333 0.33333333]]
print(data3+2)# 对应相加
# [[3. 3. 3.]
# [3. 3. 3.]]
print(data3 -2)
# [[-1. -1. -1.]
# [-1. -1. -1.]]
# 两个矩阵之间的加法和乘法
data4 = np.array([[1,2,3],[4,5,6]])
print(data3 + data4)
# [[2. 3. 4.]
# [5. 6. 7.]]
print(data3*data4) # 对应元素相乘
# [[1. 2. 3.]
# [4. 5. 6.]]
(13)matplotlib模块的使用
首先在我们的Anaconda Navigator (Anaconda3)开发的环境中,选择tensorflow环境,然后下载安装matplotlib,我们才可以使用matplotlib模块。
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1,2,3,4,5,6,7,8])
y = np.array([3,5,7,6,2,6,10,15])
# 绘制的是折线图
plt.plot(x,y,'r') # 折线 参数1:x轴的坐标,参数2:y轴的坐标 参数3颜色color
plt.plot(x,y,'g',lw=10)# 参数4:表示线条的宽度。line width
# 折线图 饼状图 柱状图
# 绘制的是柱状图
x = np.array([1,2,3,4,5,6,7,8])
y = np.array([13,25,17,36,21,16,10,15])
plt.bar(x,y,0.5,alpha=1,color='b')
# 参数一:X轴的坐标 参数二:y轴的坐标 参数三:描述的是柱状图每个柱子的占用比例(0.5) 参数四:透明度 (0-1)参数五:颜色color
plt.show()
两个问题解答、opencv、tensorflow、numpy、matplotlib的基本使用的更多相关文章
- NumPy Matplotlib库
NumPy - Matplotlib Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 ...
- 21、numpy—Matplotlib
NumPy Matplotlib Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 P ...
- 在mac安装numpy matplotlib scipy
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #fffff ...
- 用 opencv和numpy进行图片和字符串互转,并保存至 json
用 opencv和numpy进行图片和字符串互转,并保存至 json 转至 https://zhuanlan.zhihu.com/p/27349847 受 用 base64 进行图片和字符串互转,并保 ...
- Ubuntu-Python2.7安装 scipy,numpy,matplotlib 和pip
一. scipy,numpy,matplotlib sudo apt-get install python-scipy sudo apt-get install python-numpy sudo a ...
- 使用opencv和numpy实现矩阵相乘和按元素相乘 matrix multiplication vs element-wise multiplication
本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容! opencv and numpy matrix multiplication vs elemen ...
- Python C++ OpenCV TensorFlow手势识别(1-10) 毕设 定制开发
Python C++ OpenCV TensorFlow手势识别(1-10) 毕设 支持定制开发 (MFC,QT, PyQt5界面,视频摄像头识别) QQ: 3252314061 效果如下:
- opencv、numpy中矩阵转置,矩阵内的固定位置相应的坐标变换
opencv.numpy中矩阵转置,矩阵内的固定位置相应的坐标变换
- 【学习总结】GirlsInAI ML-diary day-21-初识 Numpy, Matplotlib, Seanborn [柱状图、折线图、箱图]
[学习总结]GirlsInAI ML-diary 总 原博github链接-day21 初识 Numpy, Matplotlib, Seanborn [柱状图.折线图.箱图] 一.Titanic练习赛 ...
随机推荐
- c++ string 用法
//char *和string 转换: string str="1234567; const char *p = str.c_str(); //不过这是的 *p 是const类型,不能对他进 ...
- [源码解析]Oozie来龙去脉之提交任务
[源码解析]Oozie来龙去脉之提交任务 0x00 摘要 Oozie是由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是Hadoop平台的开源的工作流调度引擎,用来管理Hadoop ...
- socket 建立网络连接,client && server
client代码: package socket; import java.io.IOException; import java.net.Socket; /** * 客户端_聊天室 * * @aut ...
- 分布式配置中心(Native - Config)
本章只讲 Spring Cloud 本地配置方式,可以很方便的高可用集群,且存在良好通讯,不用担心云服务器与内网之间GIT带来的不便,GIT(网上GIT教程一搜一大把了….) - 快速开始 Sprin ...
- actuator与spring-boot-admin 可以说的秘密
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- 本地连接虚拟机db2V10.5遇到的问题
在连接虚拟机数据库时发现自己不知道db2的端口号是多少,百度上说50000,60000的都有,所以还是决定自己试一下,并记录下这个过程 # 首先切换到db2inst1的用户 su - db2inst1 ...
- 无间歇文字滚动_ 原生js实现新闻无间歇性上下滚动
这篇文章主要介绍使用js实现文字无间歇性上下滚动,一些网站的公告,新闻列表使用的比较多,感兴趣的小伙伴们可以参考一下 ,代码实现如下. html+css部分: <style> #moocb ...
- 深入理解letter-spacing,word-spacing的对比区别
letter-spacing lletter-spacing 属性增加或减少字符间的空白(字符间距). 该属性定义了在文本字符框之间插入多少空间.由于字符字形通常比其字符框要窄,指定长度值时,会调整字 ...
- 代码文件编码unicode 无标签, 导入vs项目编译不过的问题
很多人经常需要把代码分别在linux.windows上编译.在linux中gcc编译的时候,文件格式为utf-8无bom格式,可是如果将文件拿到windows上,用vs编译的时候,发现各种报错,且都是 ...
- Centos8 - 图形界面和命令行切换
查看目前默认的启动方式 systemctl get-default 命令行模式:multi-user.target 图形界面模式:graphical.target 设置为图形界面模式 systemct ...