python 空间滤波

news2025/1/17 22:05:25

均值滤波器

空域变换包含灰度变换和空间滤波

灰度变换是通过点对点的映射进行图像增强,是一种点运算

空间滤波是基于邻域的一种运算,即图像像素的灰度值不仅和当前点有关,还和这个点周围邻域像素点的灰度值有关。所以空间滤波其实是一种加权求和的运算

空间滤波可以分为两大类:平滑和锐化

平滑是通过模糊图像来将输入图像进行平滑,它计算领域像素灰度值的平均值作为输出,类似于积分运算。因为高频的部分会被平均值吸收掉,所以平滑处理也类似是一种低通滤波

平滑的作用可以分为两类:

  1. 降低噪声:典型随机噪声是由灰度值急剧变化组成,所以平均值会降低噪声的影响
  2. 模糊处理:模糊就是平滑,平滑就是模糊。它不仅能讲噪声降低,还会将图像中的细节给模糊掉,所以会造成模糊处理

平滑滤波器需要保证滤波器的权重和为1,这有两个目的。

  1. 一是,滤波器经过灰度恒定区域的时候,滤波器输出的邻域平均值为图像的灰度值。
  2. 二是,采用归一化的核可以防止在滤波的过程中引入误差,也就是说原图像和滤波后的图像像素和是一致的
import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)
dst=cv2.blur(img,(3,3))

cv2.imshow('img', np.hstack((img, dst)))
cv2.imwrite('./image.png',np.hstack((img, dst)))
cv2.waitKey()
cv2.destroyAllWindows()

import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)

kernel=np.ones((3,3),dtype=np.float32)/9
dst=cv2.filter2D(img,-1,kernel)

cv2.imshow('img', np.hstack((img, dst)))
cv2.imwrite('./image.png',np.hstack((img, dst)))
cv2.waitKey()
cv2.destroyAllWindows()

 

import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)

kernel=np.array([[1,2,1],[2,4,2],[1,2,1]],dtype=np.float32)/16
dst=cv2.filter2D(img,-1,kernel)

cv2.imshow('img', np.hstack((img, dst)))
cv2.imwrite('./image.png',np.hstack((img, dst)))
cv2.waitKey()
cv2.destroyAllWindows()

 

高斯低通滤波器

邻域均值滤波器在平滑图像的时候虽然会降低了噪声,但是同样模糊了图像 .

我们在模糊图像的时候应该考虑一点的就是距离中心像素的的权重应该大一点远离中心像素点的影响要弱一些。满足这一特性的话,最好的滤波器是高斯核。

import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)

dst=cv2.GaussianBlur(img,(5,5),sigmaX=0.5)

cv2.imshow('img', np.hstack((img, dst)))
cv2.imwrite('./image.png',np.hstack((img, dst)))
cv2.waitKey()
cv2.destroyAllWindows()

几何均值滤波器 

几何均值滤波器和算术平均滤波器的平滑效果类似,但是损失的图像细节更少

import cv2
import numpy as np


def geometric_mean_filter(img, kernel_size=3):
    height, width = img.shape[:2]  # 获取图像的size
    ksize = kernel_size  # 滤波器的大小
    order = 1 / pow(ksize, 2)  # 阶次
    pad = int((ksize - 1) / 2)  # 填充的大小
    img_pad = np.pad(img, pad, mode='edge')  # 边缘padding

    for i in range(pad, pad + height):
        for j in range(pad, pad + width):
            ret = np.prod(img_pad[i - pad:i + pad + 1, j - pad:j + pad + 1], dtype=np.float32)  # 计算kernel里面的乘积
            img[i - pad][j - pad] = pow(ret, order)

    return img.astype(np.uint8)


img = cv2.imread("./img1.png", 0)
img_copy = img.copy()  # 图像备份

dst = geometric_mean_filter(img_copy)  # 几何均值滤波器

cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey()
cv2.destroyAllWindows()

谐波平均滤波器

谐波平均滤波器既能处理盐粒噪声,又能处理类似于高斯噪声,但是不能处理胡椒噪声

盐粒噪声salt : 是指灰度值突变成白色点的噪声(白色--->255)

胡椒噪声pepper:是指灰度值突变成黑色点的噪声(黑色--->0)

这里并不是特指0和255,是指相对突变的颜色

import cv2
import numpy as np
 
def harmonic_averaging_filter(img,kernel_size = 3): # 定义谐波平均滤波器函数
 
    height ,width = img.shape[:2]   # 获取图像的size
    ksize = kernel_size             # 滤波器的大小
    pad = int((ksize - 1) / 2)   # 填充的大小
    img_pad = np.pad(img,pad,mode='edge')  # 边缘padding
 
    bais = 1e-8  # 极小值ε
    for i in range(pad,pad+height):
        for j in range(pad,pad+width):
            ret = np.sum(1.0 / (img_pad[i - pad:i + pad + 1, j - pad:j + pad + 1] + bais),dtype=np.float32)   # 计算kernel里面的倒数并且求和
            img[i - pad][j - pad] = kernel_size * kernel_size / ret
 
    return img.astype(np.uint8)
 
 
img = cv2.imread("./img1.png", 0)
for i in range(2000):      # 添加2000个胡椒噪声
    x = np.random.randint(0,img.shape[0])
    y = np.random.randint(0,img.shape[1])
    img[x][y] = 0  # 0 为pepper 噪声 255 为salt 噪声
 
img_copy = img.copy()   # 图像备份
dst =harmonic_averaging_filter(img_copy)
 
cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey()
cv2.destroyAllWindows()
 

 

import cv2
import numpy as np


def harmonic_averaging_filter(img, kernel_size=3):  # 定义谐波平均滤波器函数

    height, width = img.shape[:2]  # 获取图像的size
    ksize = kernel_size  # 滤波器的大小
    pad = int((ksize - 1) / 2)  # 填充的大小
    img_pad = np.pad(img, pad, mode='edge')  # 边缘padding

    bais = 1e-8  # 极小值ε
    for i in range(pad, pad + height):
        for j in range(pad, pad + width):
            ret = np.sum(1.0 / (img_pad[i - pad:i + pad + 1, j - pad:j + pad + 1] + bais),
                         dtype=np.float32)  # 计算kernel里面的倒数并且求和
            img[i - pad][j - pad] = kernel_size * kernel_size / ret

    return img.astype(np.uint8)


img = cv2.imread("./img1.png", 0)
for i in range(2000):  # 添加2000个胡椒噪声
    x = np.random.randint(0, img.shape[0])
    y = np.random.randint(0, img.shape[1])
    img[x][y] = 255  # 0 为pepper 噪声 255 为salt 噪声

img_copy = img.copy()  # 图像备份
dst = harmonic_averaging_filter(img_copy)

cv2.imshow('img', np.hstack((img, dst)))
cv2.imwrite('./image.png',np.hstack((img, dst)))
cv2.waitKey()
cv2.destroyAllWindows()

 

反谐波平均滤波器

Q = 0 的时候,反谐波滤波器简化为算术平均滤波器,也就是邻域均值滤波器
Q > 0 的时候,处理胡椒噪声
Q < 0 的时候,处理盐粒噪声
Q = -1 的时候,简化为谐波平均滤波器
反谐波平均滤波器可以处理salt-pepper噪声,但是不能同时处理

很容易理解,处理噪声需要Q满足一定的条件,所以Q不能同时正负

import cv2
import numpy as np


def inverse_harmonic_averaging_filter(img, kernel_size=3, Q=1.5):  # 反谐波平均滤波器

    height, width = img.shape[:2]  # 获取图像的size
    ksize = kernel_size  # 滤波器的大小
    pad = int((ksize - 1) / 2)  # 填充的大小
    img_pad = np.pad(img, pad, mode='edge')  # 边缘padding

    order = Q  # 阶数
    bais = 1e-8  # 偏差,防止分母为 0
    for i in range(pad, pad + height):
        for j in range(pad, pad + width):
            sub_area = img_pad[i - pad:i + pad + 1, j - pad:j + pad + 1] + bais  # kernel里面的子区域
            img[i - pad][j - pad] = np.sum(pow(sub_area, order + 1)) / np.sum(pow(sub_area, order))

    return img.astype(np.uint8)


img = cv2.imread("./img1.png", 0)
img_old = img.copy()  # 拷贝原图

for i in range(5000):  # 手工添加噪声点,0为pepper噪声,255为salt噪声
    x = np.random.randint(0, img.shape[0])
    y = np.random.randint(0, img.shape[1])
    img[x][y] = 0
img_noise = img.copy()  # 备份噪声图像

dst_pos = inverse_harmonic_averaging_filter(img.copy(), Q=1.5)
dst_neg = inverse_harmonic_averaging_filter(img.copy(), Q=-1.5)
cv2.imshow('img', np.hstack((img_old, img_noise, dst_pos, dst_neg)))  # 图像顺序:原图、噪声图、处理后的图
cv2.waitKey()
cv2.destroyAllWindows()

 统计排序滤波器

统计排序滤波器不同于之前的滤波器,首先滤波器的内部是没有权重的,因为它是一种统计量的表达。并且,统计排序滤波器是将滤波范围内的区域按照设定排序,所以它也区别于几何均值滤波器等等,因为它不对像素点进行改变。

中值滤波是用滤波器处理区域的中值灰度值去代替像素的值,其特点是能够有效降低随机噪声,且模糊程度要小得多,所以中值滤波器处理椒盐噪声的效果尤为突出。

salt-pepper噪声:不是特指0,255这两个像素点,它是指噪声以黑白点的形式叠加在图像上。只要它满足如下两个条件,我们就说它是属于椒盐噪声点

灰度值突变的点,它应该是噪声点,噪声是由图像灰度值突变形成的
灰度值较周围的像素点灰度而言,过亮(最亮为255,属于salt噪声)或者过暗(最暗为0,属于pepper噪声)

最大值滤波是找到滤波器处理区域的最大值灰度值去代替像素的值,它能够找到被处理区域中的最亮点,或者用于削弱与明亮区域相邻的暗区域。而胡椒噪声是灰度值突变成很低的点,所以最大值滤波可以有效降低胡椒噪声

最小值滤波是找到滤波器处理区域的最小值灰度值去代替像素的值,它能够找到被处理区域中的最暗点,或者用于削弱与暗色区域相邻的明亮区域。而盐粒噪声是灰度值突变成很高的点,所以最小值滤波可以有效降低盐粒噪声

中点滤波是找到滤波器处理区域的最小值灰度值和最大值灰度值的中点去代替像素的值,中点滤波器适用于处理随机分布的噪声,例如高斯噪声或者均匀噪声

import cv2
import numpy as np


def statistical_sorting_filter(img, kernel_size=3, transform='median'):
    height, width = img.shape[:2]  # 获取图像的长宽
    ksize = kernel_size  # 滤波器的size
    pad = int((ksize - 1) / 2)  # padding 的大小
    img_pad = np.pad(img, pad, mode="edge")  # 将原图进行边缘上的填充

    for i in range(pad, pad + height):  # 遍历img_pad 图像的点,将滤波后的带能赋值给原图img对应位置
        for j in range(pad, pad + width):
            value = img_pad[i - pad:i + pad + 1, j - pad:j + pad + 1]  # 取出子区域

            if transform == 'median':  # 中值滤波
                img[i - pad][j - pad] = np.median(value)
            if transform == 'max':  # 最大值滤波
                img[i - pad][j - pad] = np.max(value)
            if transform == 'min':  # 最小值滤波
                img[i - pad][j - pad] = np.min(value)
            if transform == 'middle':  # 中点滤波
                img[i - pad][j - pad] = value.max() * 0.5 + value.min() * 0.5

    return img.astype(np.uint8)


img = cv2.imread('./img1.png', 0)
img_old = img.copy()  # 拷贝原图

for i in range(5000):  # 随机加入椒盐噪声
    x = np.random.randint(0, img.shape[0])
    y = np.random.randint(0, img.shape[1])
    img[x][y] = np.random.randint(0, 2) * 255  # 生成 0,1 ,扩大255倍,就会生成0,255椒盐点
img_noise = img.copy()  # 拷贝噪声图

dst = statistical_sorting_filter(img, transform='max')  # 统计滤波器处理
cv2.imshow('img', np.hstack((img_old, img_noise, dst)))  # 图像顺序:原图、噪声图、处理后的图像
cv2.waitKey()
cv2.destroyAllWindows()

锐化处理 - 一阶差分算法(Sobel、Scharr算子)

空间滤波的另一种用途是图像的锐化锐化的作用是突出灰度中的过渡区域

图像的模糊在空间域当中可以通过平滑(平均)邻域中的像素实现,类似于积分运

图像的锐化在空间域当中可以通过锐化(差值)邻域中的像素实现,类似于微分运算

因为差值会计算出两个像素灰度值的差异,而在灰度值变换平坦的区域差值几乎为零。所以,锐化滤波的作用是削弱图像灰度值变换缓慢的区域,同时增强灰度值存在明显差异的区域,这些区域往往是边缘或者噪声。

我们经常把高频叫做细节,低频叫做背景

定义差分的方法需要满足如下要求:

 

  • 恒定区域的一阶导数必须为零
  • 灰度台阶或者斜坡的开始处一阶导数必须为零
  • 灰度斜坡的一阶导数必须非零

灰度台阶:紧邻两个像素点的灰度值突变

灰度斜坡:若干个像素点,紧邻的像素点均有差异,且差异值不变

因为锐化对灰度值平坦的区域不会有反应,所以滤波器的和应该为0 

Sobel 算子 

import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)
img = cv2.resize(img, None, fx=0.6, fy=0.6)  # 缩放图像

sobel_x = cv2.Sobel(img, cv2.CV_16S, dx=1, dy=0)  # 求取梯度图像,dx代表水平梯度
sobelx = cv2.convertScaleAbs(sobel_x)  # 取绝对值,并转为uint8

sobel_y = cv2.Sobel(img, cv2.CV_16S, dx=0, dy=1)  # 求取梯度图像,dy代表垂直梯度
sobely = cv2.convertScaleAbs(sobel_y)  # 取绝对值,并转为uint8

sobel_img = cv2.addWeighted(sobelx, 1, sobely, 1, 0)  # 加权求和

cv2.imshow('img', np.hstack((img, sobelx, sobely, sobel_img)))
cv2.waitKey()
cv2.destroyAllWindows()

 

Scharr 算子

Scharr 和 Sobel 算子类似,只不过增加了中心位置的权重

 

import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)
img = cv2.resize(img, None, fx=0.6, fy=0.6)  # 缩放图像

"""
这里图像的深度不能写-1,负责会和输入图像的数据类型一致,也就是uint8无符号类型,那么梯度出现负的时候就会被零截断,这是我们不想看到的
图像深度的表示如图,这里我们用 CV_16S,因为灰度值差异不会很大
"""
sobel_x = cv2.Scharr(img, cv2.CV_16S, dx=1, dy=0)  # 求取梯度图像,dx代表水平梯度
sobelx = cv2.convertScaleAbs(sobel_x)  # 取绝对值,并转为uint8

sobel_y = cv2.Scharr(img, cv2.CV_16S, dx=0, dy=1)  # 求取梯度图像,dy代表垂直梯度
sobely = cv2.convertScaleAbs(sobel_y)  # 取绝对值,并转为uint8

sobel_img = cv2.addWeighted(sobelx, 1, sobely, 1, 0)  # 加权求和

cv2.imshow('img', np.hstack((img, sobelx, sobely, sobel_img)))
cv2.imwrite('./image.png',np.hstack((img, sobelx, sobely, sobel_img)))
cv2.waitKey()
cv2.destroyAllWindows()

 

 锐化处理 - 二阶差分算法(拉普拉斯)

一阶差分算法可以有效的提取目标的边缘

但是数字图像中的边缘在灰度上通常类似于斜坡过度,而一阶差分的定义是在灰度斜坡的一阶导数必须是非零的,所以图像的一阶差分会导致较宽的边缘

于是我们可以将一阶差分再次进行差分,也就是二阶差分去获取更加精细的图像

二阶差分的定义需要满足以下条件:

灰度值恒定的区域二阶导数必须为零
灰度台阶或者灰度斜坡的开始处和结束处二阶导数必须非零
灰度台阶的二阶导数必须为零

因此二阶差分会突出图像中的急剧灰度过渡,并不强调灰度值缓慢变换的区域,所以往往会产生具有灰色边缘线和其他不连续性的图像,且往往二阶导数的图像都是偏暗的

为了突出图像,往往将拉普拉斯图像和原图像相加,既可以恢复背景特征,又可以保留二阶导数的锐化效果

import cv2
import numpy as np

img = cv2.imread('./img1.png', 0)
img = cv2.resize(img, None, fx=0.7, fy=0.7)  # 缩小图像

img_blur = cv2.GaussianBlur(img, (7, 7), sigmaX=1)  # 高斯模糊图像
img_sharpen = cv2.Laplacian(img_blur, cv2.CV_16S)  # 拉普拉斯算子处理
img_sharp = cv2.convertScaleAbs(img_sharpen)  # 取绝对值,并转为uint8

dst = img - img_sharpen  # 叠加到原图
dst = cv2.normalize(dst, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)  # 归一化

cv2.imshow('img', np.hstack((img, img_blur, img_sharp, dst)))
cv2.waitKey()
cv2.imwrite('./image.png',np.hstack((img, img_blur, img_sharp, dst)))

cv2.destroyAllWindows()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何管理oralce口令文件和参数文件

口令文件 口令文件审核 Step 1: 使用root账号将 oracle dba的权限移除 [rootoracle-db-19c ~]# su - oracle [oracleoracle-db-19c ~]$ [oracleoracle-db-19c ~]$ id oracle uid1501(oracle) gid1501(oinstall) groups1501(oinstall),1502(dba),1503(oper),1504(backupdba)…

浅析linux 内核 高精度定时器(hrtimer)实现机制(一)

1 hrtimer 概述 在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足&#xff0c;最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高&#xff0c;定时器层的分辨率只能达到Tick级别&#xff0c;按照内核配置选项的不同&#xff0c;在100Hz到1000…

灵界的科学丨一、灵界在哪里?

摘自李嗣涔教授《灵界的科学》 在国内物理学界近十位学者的见证下&#xff0c; 发现我们所处四度时空的物质世界之外&#xff0c; 似乎还有一个世界的存在&#xff0c; 当年我把这个世界称作信息场&#xff0c; 也就是俗称的灵界。 二十世纪末宇宙大尺度谜团的重大发现──…

设计模式学习记录

设计模式 UML图&#xff1a; ------> 依赖 ——>关联 -------▲ 实现 —–—▲ 继承 &#x1f53a;———> 聚合 ▲———> 组合&#xff08;关联性更强&#xff09; 一、策略模式&#xff08;行为型&#xff09; 策略模式&#xff1a;是一种定义一系列算法的方法…

Java --- Spring6项目创建及注意事项

目录 一、Spring框架解决的问题 二、Spring介绍 三、Spring八大模块 四、Spring特点 五、第一个Spring6入门程序 六、spring的细节 6.1、配置文件的bean的id不能重复 6.2、spring底层是通过反射调用无参构造方法创建对象 6.3、spring会把创建好的对象存储在Map集合中 6.4…

【数据结构初阶】树+二叉树+堆的实现

真正的勇士&#xff0c;就是在看清生活的真相后&#xff0c;依旧慷慨面对他所遭受的苦难与挫折。 大学究竟教会了我们什么呢&#xff1f;或许答案只有一个&#xff0c;看清自己&#xff0c;与自己和解&#xff0c;和自己坐下来谈一谈。 人生或许本就没有什么意义&#xff0c;…

MySQL的缓冲池(buffer pool)及 LRU算法

1.什么是缓冲池&#xff08;buffer pool&#xff09; buffer pool 是数据库的一个内存组件&#xff0c;里面缓存了磁盘上的真实数据&#xff0c;Java系统对数据库的增删改操作&#xff0c;主要是这个内存数据结构中的缓存数据执行的。 控制块 存的是 数据页所属的表 空间号&a…

MATLAB break语句

MATLAB中 break 语句用于终止 for 或 while 循环的执行&#xff0c;当在循环体内执行到该语句的时候&#xff0c;程序将会跳出循环&#xff0c;继续执行循环语句的下一语句。 注意&#xff1a;在嵌套循环中&#xff0c;break 退出只能在循环发生&#xff0c;后通过的声明控制循…

git关于创建/删除分支常用命令

主要用来介绍git中如何操作分支的命令&#xff1a; 1.git查看所有的分支: git branch -a 2.创建本地分支&#xff1a; git checkout -b <name> 3.有了本地分支之后推送到远程分支; git push origin <name> 4.切换分支&#xff1a; git checkout <name> 5.删除…

黑*头条_第5章_文章发布粉丝管理成形记

黑*头条_第5章_文章发布&粉丝管理成形记 文章目录黑*头条_第5章_文章发布&粉丝管理成形记文章发布&粉丝管理1 需求分析1.1 功能需求1.2 前端需求1.2.1 图文数据需求1.2.2 素材管理需求1.2.3 发布文章需求1.2.4 内容列表需求1.2.5 粉丝概况需求2 定义2.1 后端定义2.…

MacBook磁盘内存空间清理软件CleanMyMac2023

Mac电脑用的时间久了&#xff0c;Mac用户尤其是MacBook用户会经常收到“磁盘几乎已满”的提示&#xff0c;如何解决这个问题&#xff0c;当我们使用苹果MAC一段时间后&#xff0c;就会有大量的垃圾文件占用磁盘空间&#xff0c;例如系统缓存文件、应用程序缓存文件、备份和重复…

2022/11/18[指针] 关于指针的初步理解

先看一段利用指针交换a和b值得代码&#xff1a; #include<stdio.h> void swap(int* p1, int* p2); int main() {int a, b;int* pa, * pb;printf("enter:");scanf_s("%d%d", &a, &b);pa &a;pb &b;printf("%d,%d\n", pa,…

面试:线程池核心线程如何保持一直运行的

对于Java中 Thread 对象&#xff0c;同一个线程对象调用 start 方法后&#xff0c;会在执行完run 后走向终止&#xff08;TERMINATED&#xff09;状态&#xff0c;也就是说一个线程对象是不可以通过多次调用 start 方法重复执行 run 方法内容的。Java的线程是不允许启动两次的&…

frp内网穿透服务

参考博客&#xff1a; https://www.jianshu.com/p/19ea81efffc4 https://blog.csdn.net/yj222333/article/details/124752420 依赖于&#xff1a;Github开源软件FRP 下载地址&#xff1a;https://github.com/fatedier/frp/releases frp 主要由 客户端(frpc) 和 服务端(frps…

基于JAVA景区售票系统设计与实现 开题报告

本科生毕业论文 基于java框架springboot旅游景区景点购票系统 开题报告 学 院&#xff1a; 专 业&#xff1a; 计算机科学与技术 年 级&#xff1a; 学生姓名&#xff1a; 指导教师…

三维模型文件以及obj、ply格式文件生成pcd点云文件

方法一、三维模型文件生成obj文件 要想生成点云文件&#xff0c;要先将三维模型文件保存为obj文件格式&#xff0c;步骤如下&#xff1a; 通过SolidWorks将模型保存为stl文件格式打开SolidWorks的插件选择&#xff0c;在ScanTo3D前面打勾 在solidworks中以网格文件的形式打开…

通信算法之九十六:电力通信系统-HRF多载波通信系统-物理层收发信道开发

目录1.HRF通信系统-物理层收发信道开发1.1 SIG发射机算法功能模块1.2 SIG接收机算法功能模块1.3 PHR发射机算法功能模块1.4 PHR接收机算法功能模块1.5 PSDU发射接收机处理流程1.6前导LTF/STF序列发射接收处理流程1.7PPDU帧&#xff08;前导SIGPHRPSDU&#xff09;发射接收处理流…

阿里云服务器(Ubuntu)配置nextcloud个人网盘

tags: Ubuntu Server Linux 写在前面 最近迷恋上了云服务器的配置, 感觉云服务器能做的事情太多了, 不管是docker还是直接部署, 都是相当方便快捷的, 下面来看看在阿里云服务器配置nextcloud网盘的基本配置方法, 这里参考了一篇文章1, 写的相当详细了, 我这里只是做一些补充.…

【5G MAC】Msg1 TX开环功控介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

使用python编写mqtt客户端向EMQX服务器发送数据

摘要&#xff1a;本文介绍如何用python编写一个mqtt客户端向EMQX服务器发送数据&#xff0c;实现一个简易的本地物联网服务器。 上一篇文章讲到使用mqtt.fx软件来发布消息。 (1条消息) 使用mqtt.fx向EMQX服务器发送消息_TMS320VC5257H的博客-CSDN博客https://blog.csdn.net/yo…