Python实现:高斯滤波 均值滤波 中值滤波 Canny(边缘检测)PCA主成分分析 直方图规定化 Mean_Shift

news2024/12/31 4:58:59

Python实现:高斯滤波 均值滤波 中值滤波 Canny(边缘检测)PCA主成分分析 直方图规定化 Mean_Shift(文末附上整合这些函数的可视化界面并且已做打包处理)

1.高斯滤波(以下函数所有的图片路径为方便前来copy的同学,修改这里全设置为绝对路径,卷积核大小和其他参数按照自己需求改)

import cv2
import numpy as np
import math
SIZE = 3 # 卷积核大小(只能为奇数)
padding = SIZE // 2
sigma = 3

# 生成高斯卷积核(定卷积核中心坐标为(0,0))
GaussKernel = np.zeros((SIZE, SIZE))
for i in range(SIZE):
    for j in range(SIZE):
        xxAddyy = math.pow(i - padding, 2) + math.pow(j - padding, 2)
        GaussKernel[i, j] = math.exp(-xxAddyy / (2 * math.pow(sigma, 2))) / 2 * math.pi * math.pow(sigma, 2)
sum = np.sum(GaussKernel)
GaussKernel = GaussKernel / sum  # 归一化

""""
            TmMask2   带有padding和img的模板
            x,y为TmMask2映射到Temp的像素偏移量  
"""


# 获取待模糊像素(x,y)附近Mask大小的像素区域
def GetMatrix(TmMask2, x, y):
    Temp = np.zeros([SIZE, SIZE])
    for X in range(SIZE):
        for Y in range(SIZE):
            Temp[X][Y] = TmMask2[x + X][y + Y]
    return np.array(Temp)  # 返回需要卷积的区域副本


"""***********************      一.读取图像                  ************************************"""
path_Gaussian =r'C:\Users\Administrator\Desktop\GUI2\fun\images\GaussianBlur.jpg'#输入图片的绝对路径
img = cv2.imread(path_Gaussian, 0)
img2 = cv2.imread(path_Gaussian, 0)
h, w = img.shape  # 高度 宽度
"""***********************     二.制作padding模板             ************************************"""
TmMask = np.zeros([h + padding * 2, w + padding * 2])
TmMask[padding:h + padding, padding:w + padding] = img  # 把图像嵌入空白模板TmMask的padding内

"""***********************     三.卷积并修改原灰度图的像素值     ************************************"""
# 对img每个像素循环卷积修改img图像数组中的值
for x in range(h):
    for y in range(w):
        # 卷积(数组相乘)并修改原图像素
        img[x][y] = np.sum(GetMatrix(TmMask, x, y) * GaussKernel)

""" ***********************     四.高斯平滑后与原灰度图输出     ************************************"""
cv2.imshow("Gaussian", img)
cv2.imshow("SRC", img2)
cv2.waitKey()

左侧为原图右侧为高斯滤波后的图
在这里插入图片描述

2.均值滤波

import cv2
import numpy as np

path = r"C:\Users\Administrator\Desktop\GUI2\fun\images\LennaSaltNoise.jpg"  # 图像路径
SIZE = 5#卷积核大小
padding = SIZE // 2  # 四个方向需要加的padding大小


def Middle(temp, x, y, SIZE):
    sum = 0
    for X in range(SIZE):
        for Y in range(SIZE):
            sum += temp[x + X][y + Y]
    return round(sum / (SIZE * SIZE))  # 返回平均数(四舍五入)


"""***********************************************           START         ***********************************************************"""
# img = Image.open("E:\\a2.jpg").convert('L')#读取图片并转为灰度图
# img = Image.open(path).convert('L')#读取图片并转为灰度图
img = cv2.imread(path, 0)
img2 = cv2.imread(path, 0)
h, w = img.shape  # 行 列

# 生成一个带有padding的临时模板图像
TempArry = np.zeros([h + padding * 2, w + padding * 2])  # 生成一个和图像对应的加入padding的空白模板
TempArry[padding:h + padding, padding:w + padding] = img  # 把图像嵌入空白模板的padding内

# 循环对像素进行逐像素中值滤波
for x in range(0, h):
    for y in range(0, w):
        img[x, y] = Middle(TempArry, x, y, SIZE)  # 卷积后的中位数赋值给原灰度图像素

cv2.imshow("Mean", img)
cv2.imshow("SRC", img2)
cv2.waitKey()

左图为带有噪声的输入原图,右图为经过均值滤波后的图片在这里插入图片描述

3.中值滤波

import cv2
import numpy as np

path = "E:\\LennaSaltNoise.jpg"  # 图像路径
SIZE = 5  # 卷积核大小
padding = SIZE // 2  # 四个方向需要加的padding大小


def Middle(temp, x, y, SIZE):
    # Mask = np.zeros([SIZE,SIZE])#临时卷积核
    s = []  # 把(x,y)周围像素(也就是对应卷积区域)的像素放入列表s
    for X in range(SIZE):
        for Y in range(SIZE):
            # Mask[X,Y] = temp[x+X][y+Y]
            s.append(temp[x + X][y + Y])
    s.sort()
    return int(s[SIZE * SIZE // 2 + 1])  # 返回中位数


"""***********************************************           START         ***********************************************************"""
# img = Image.open("E:\\a2.jpg").convert('L')#读取图片并转为灰度图
# img = Image.open(path).convert('L')#读取图片并转为灰度图
img = cv2.imread(path, 0)
img2 = cv2.imread(path, 0)
h, w = img.shape  # 行 列

# 生成一个带有padding的临时模板图像
TempArry = np.zeros([h + padding * 2, w + padding * 2])  # 生成一个和图像对应的加入padding的空白模板
TempArry[padding:h + padding, padding:w + padding] = img  # 把图像嵌入空白模板的padding内

# 循环对像素进行逐像素中值滤波
for x in range(0, h):
    for y in range(0, w):
        img[x, y] = Middle(TempArry, x, y, SIZE)  # 卷积后的中位数赋值给原灰度图像素

cv2.imshow("Middle", img)
cv2.imshow("SRC", img2)
cv2.waitKey()

左图为带有噪声的输入原图,右图为经过中值滤波后的图
在这里插入图片描述

4.Canny边缘检测

import numpy as np
import cv2

"""
              # ******高斯平滑******

sigma1 = sigma2 = 1
sum = 0
gaussian = np.zeros([5, 5])
for i in range(5):
    for j in range(5):
        gaussian[i, j] = math.exp(-1 / 2 * (np.square(i - 2) / np.square(sigma1)  # 生成二维高斯分布矩阵
                                            + (np.square(j - 2) / np.square(sigma2)))) / (2 * math.pi * sigma1 * sigma2)
        sum = sum + gaussian[i, j]

gaussian = gaussian / sum

plt.show()
"""

# 转化为灰度值图像
"""******************************      一 读取三通道图            ****************************"""
img = cv2.imread(r'C:\Users\Administrator\Desktop\GUI2\fun\images\world.jpg', 1)
# img5 =  cv2.imread('E:\\Lenna1.jpg',0)
"""*****************************        二 通道图转换成灰度图     ***************************"""


def rgb2gray(rgb):
    return np.dot(rgb[..., :3], [0.114, 0.587, 0.299])


gray = rgb2gray(img)  # 灰度图
W, H = gray.shape

"""*****************************        三 生成梯度图           ***************************"""
new_gray = cv2.GaussianBlur(gray, (5, 5), 0)  # 高斯模糊
# 求梯度幅值
W1, H1 = new_gray.shape
dx = np.zeros([W1 - 1, H1 - 1])
dy = np.zeros([W1 - 1, H1 - 1])
d = np.zeros([W1 - 1, H1 - 1])  # 图像幅度值

# dx1 = np.zeros([W1 - 1, H1 - 1])
# dy1 = np.zeros([W1 - 1, H1 - 1])
# d1 = np.zeros([W1 - 1, H1 - 1])#图像幅度值
for i in range(W1 - 1):
    for j in range(H1 - 1):
        dy[i, j] = new_gray[i + 1, j] - new_gray[i, j]
        dx[i, j] = new_gray[i, j + 1] - new_gray[i, j]
        d[i, j] = np.sqrt(np.square(dx[i, j]) + np.square(dy[i, j]))  # 图像梯度幅值作为图像强度值

#        dy1[i, j] = new_gray2[i + 1, j] - new_gray2[i, j]
#       dx1[i, j] = new_gray2[i, j + 1] - new_gray2[i, j]
#       d1[i, j] = np.sqrt(np.square(dx1[i, j]) + np.square(dy1[i, j]))  # 图像梯度幅值作为图像强度值

"""*****************************        四 非极大值抑制           ***************************"""
W2, H2 = d.shape
NMS = np.copy(d)
NMS[0, :] = NMS[W2 - 1, :] = NMS[:, 0] = NMS[:, H2 - 1] = 0
for i in range(1, W2 - 1):
    for j in range(1, H2 - 1):
        if d[i, j] == 0:
            NMS[i, j] = 0
        else:
            gradX = dx[i, j]
            gradY = dy[i, j]
            gradTemp = d[i, j]

            # 如果Y方向幅度值较大
            if np.abs(gradY) > np.abs(gradX):
                weight = np.abs(gradX) / np.abs(gradY)
                grad2 = d[i - 1, j]
                grad4 = d[i + 1, j]
                # 如果x,y方向梯度符号相同
                if gradX * gradY > 0:
                    grad1 = d[i - 1, j - 1]
                    grad3 = d[i + 1, j + 1]
                # 如果x,y方向梯度符号相反
                else:
                    grad1 = d[i - 1, j + 1]
                    grad3 = d[i + 1, j - 1]
                gradTemp1 = weight * grad1 + (1 - weight) * grad2
                gradTemp2 = (1 - weight) * grad3 + weight * grad4
                # 如果X方向幅度值较大
            else:
                weight = np.abs(gradY) / np.abs(gradX)
                grad2 = d[i, j - 1]
                grad4 = d[i, j + 1]
                # 如果x,y方向梯度符号相同
                if gradX * gradY > 0:
                    grad1 = d[i + 1, j - 1]
                    grad3 = d[i - 1, j + 1]
                # 如果x,y方向梯度符号相反
                else:
                    grad1 = d[i - 1, j - 1]
                    grad3 = d[i + 1, j + 1]
                gradTemp1 = (1 - weight) * grad1 + weight * grad2
                gradTemp2 = weight * grad3 + (1 - weight) * grad4

            if gradTemp >= gradTemp1 and gradTemp >= gradTemp2:
                NMS[i, j] = gradTemp
            else:
                NMS[i, j] = 0

"""*****************************        五 双阈值算法检测        ***************************"""
W3, H3 = NMS.shape
DT = np.zeros([W3, H3])
# 定义高低阈值
TL = 0.1 * np.max(NMS)
TH = 0.15 * np.max(NMS)
"""
        当 “实际梯度 < 低阈值” 该点被录取为“非边缘点(背景点)
        当 “实际梯度 > 高阈值” 该点被录取为“边缘点”
        当低阈值< 实际梯度低< 高阈值 ”  ,需要判别
                                     如果周围八邻阈的点有大于高阈值的,凡梯度大者被录取为边缘点。
"""
for i in range(1, W3 - 1):
    for j in range(1, H3 - 1):
        if (NMS[i, j] < TL):  # 小于低阈值背景点
            DT[i, j] = 0
        elif (NMS[i, j] > TH):  # 大于高阈值边缘点
            DT[i, j] = 255
        elif (np.any((NMS[i - 1, j - 1:j + 2] > TH)).any() or NMS[i, j - 1] > TH or NMS[
            i, j + 1] > TH  # 低阈值 < x < 高阈值 比较八邻域
              or np.any((NMS[i + 1, j - 1:j + 2] > TH))):
            DT[i, j] = 255
cv2.imshow("gray", DT)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("E:\\car_canny.jpg", DT)

上图为输入原图,下图为经过Canny边缘检测后的图
在这里插入图片描述
在这里插入图片描述

5.直方图规定化

import numpy as np
import cv2
import bisect


# 计算累计概率分布Pr
def get_Sk(Hist):
    sum_Hist = sum(Hist)
    Pr = Hist / sum_Hist
    # 计算累计概率Sk
    Sk = []
    temp = 0
    for n in Pr:
        sk = temp + n
        Sk.append(sk)
        temp = sk
    Sk = np.asarray(Sk)
    return Sk


# 映射表   sk1(原图概率密度)  sk2(目标图概率密度)
def get_lut(sk1, sk2):
    index = np.zeros(256, dtype='uint8')
    a = 0
    for i in np.nditer(sk1):
        subscript = bisect.bisect_right(sk2, i)
        if subscript >= 256:  # 防止二分查找出现256下标越界
            subscript = 255
        if abs(sk2[subscript] - i) < abs(sk2[subscript - 1] - i):
            index[a] = subscript
        else:
            index[a] = subscript - 1
        a = a + 1
    return index


"""*************************************          START             ******************************************"""
Src = cv2.imread(r'C:\Users\Administrator\Desktop\GUI2\fun\images\MV.jpg', 0)  # 输入图
Dist = cv2.imread(r'C:\Users\Administrator\Desktop\GUI2\fun\images\car.jpg', 0)  # 目标图

# 1.获取原图和目标图直方图信息
SrcHist = cv2.calcHist([Src], [0], None, [256], [0, 255])
DistHist = cv2.calcHist([Dist], [0], None, [256], [0, 255])

# 2.计算原图直方图和目标图各灰度级累计概率密度
pr = get_Sk(SrcHist)
pz = get_Sk(DistHist)

# 3.生成 原图直方图累计概率密度 和目标直方图累计概率密度单映射表
SML = get_lut(pr, pz)

# 4.遍历图像各个灰度值,完成原图直方图到目标直方图类型的映射
h, w = Src.shape  # 列 行
ImgOutput = Src.copy()
for i in range(0, h):
    for j in range(0, w):
        ImgOutput[i][j] = SML[ImgOutput[i][j]]

cv2.imshow("Src", Src)
cv2.imshow("Aim", Dist)
cv2.imshow("After", ImgOutput)  # 规定花后的图
cv2.waitKey()

上图为原图
中图为规定目标图
下图为原图经过规定化后的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.PCA

import numpy as np
import cv2



path = r"C:\Users\Administrator\Desktop\GUI2\fun\images\MV.jpg"
# 读入  灰度图
img: np.ndarray = cv2.imread(path)
img = img[:, :, 0]
cv2.imshow("before", img)

# 预处理
h, w = img.shape
b = np.mean(img, axis=0)
STD = np.std(img, axis=0)
img = img - b
img = img / STD

img_T = img.transpose()
Mat = img_T.dot(img)  # 得到 X * X_T

# 求 X * X_T 的前k大特征向量
eigvals, vecs = np.linalg.eig(Mat)  # 注意求出的eigvals是特征值,vecs是标准化后的特征向量
indexs = np.argsort(eigvals)
indexs = indexs[::-1]
print(eigvals.shape)

# 编码矩阵 D 是前k大特征向量组成的矩阵(正交矩阵)——topk_evecs
k = 60 #取前60大特征值
topk_evecs: np.ndarray = vecs[:, indexs[0:k]]
print(topk_evecs.shape)

# X * D = 维度压缩后的图片信息——encode  (信息由 512 x 512 压缩为 512 x 64)
encode = img.dot(topk_evecs)

# 译码矩阵即 D_T
img_new = ((encode.dot(topk_evecs.transpose()) * STD) + b).astype(np.uint8)  # 译码得到的新图片
# print(img_new)
img_new[img_new < 0] = 0
img_new[img_new > 255] = 255

cv2.imshow("after", img_new)
cv2.waitKey(0)

左图为原输入图,右图为经过PCA后又还原回来的图(还原回来后图像信息有损失)
在这里插入图片描述

Mean_Shift(图像选小一些,参数R给大一些,运行就很慢这玩意一般都是调库,一般都是用C++实现的罕有Python实现)

import numpy as np
import cv2 as cv
# 图像预处理(放到数组中像素个数行5列的数组中)
def mean_shift(img):
    rows, cols, channel = img.shape
    rgb_array = np.zeros((rows * cols, 5))# (rows*cols)行   5列(RGBxy)  每一行保存一个像素点的信息
    dstimg = np.zeros((rows, cols, channel))#原图同大小同深度的空白图像


    k = 0
    #遍历图像把每个像素点三通道RGB和坐标xy放入数组
    for i in range(0, rows):
        for j in range(0, cols):
            rgb_array[k][0], rgb_array[k][1], rgb_array[k][2], rgb_array[k][3], rgb_array[k][4] = img[i][j][0], img[i][j][1], img[i][j][2], i, j
            k += 1

# 聚类的圆形半径与收敛条件
    r = 60# r是每次圆形聚类的半径
    convergence = 50#每次圆形聚类收敛的条件   (中心点代替此次聚类半径中所有点)



    temp_point = []#临时存放中心点r半径内所有像素点信息
    #初始化标签flag,用来控制是否初始化中心点坐标
    flag = False
    while rgb_array.shape[0] != 0:
        #在rows*cols个像素点中随机找出一个作为初始化中心点
        if flag == False:
            index_row = np.random.randint(0, rgb_array.shape[0])  # 任意寻找一个点作为开始的点
            mean_r = rgb_array[index_row][0]
            mean_g = rgb_array[index_row][1]
            mean_b = rgb_array[index_row][2]
            mean_x = rgb_array[index_row][3]
            mean_y = rgb_array[index_row][4]

        #对每个像素点进行遍历,找出在空间r内的点,
        #并将像素值记录在temp_point中,下标信息记录在index中
        index = []
        for i in range(0, rgb_array.shape[0]):#按行遍历
            #(该点到中心点的距离)(像素点的五个信息全部参与运算这样会更精确一些)
            L = ((rgb_array[i][0] - mean_r) ** 2 + (rgb_array[i][1] - mean_g) ** 2 +(rgb_array[i][2] - mean_b) ** 2 + (rgb_array[i][3] - mean_x) ** 2 + (rgb_array[i][4] - mean_y) ** 2) ** 0.5

            if L <= r:#该像素点在球半径r内,距离<所定半径
                temp_point.append(rgb_array[i])#把符合条件的像素点信息与坐标储存起来
                index.append(i)

        #判断半径r内是否有像素点
        if len(temp_point) > 0:
            element0, element1, element2,element3, element4 = 0, 0, 0, 0, 0

            #求偏移距离
            #步骤:step1:将所有在半径内的像素点求和
            #     step2:对求和向量均值化,得到需要移动到终点
            #     step3:对均值化的求和向量减去中心点向量的模得到偏移距离(判断接下来是否进行漂移)

            # step1 向量求和(半径r范围内所有像素点点的五行一列的点向量求和)
            for i in range(0, len(temp_point)):
                element0 += temp_point[i][0]
                element1 += temp_point[i][1]
                element2 += temp_point[i][2]
                element3 += temp_point[i][3]
                element4 += temp_point[i][4]
            # step2 求和向量均值化,得到需要移动到终点坐标
            element0 = element0 / len( temp_point)
            element1 = element1 / len(temp_point)
            element2 = element2 / len(temp_point)
            element3 = element3 / len(temp_point)
            element4 = element4 / len(temp_point)

            # step2 终点坐标减去中心点向量取距离得偏移距离
            new_L = ((element0 - mean_r) ** 2 + (element1 - mean_g) ** 2 + (element2 - mean_b) ** 2 + (element3 - mean_x) ** 2 + (element4 - mean_y) ** 2) ** 0.5

            #偏移距离超参
                        #小于convergence,停止漂移,并将原图中所有半径<r像素点用中心点去替代他们,并赋值给空白图像dstimg
                        #大于convergence,继续漂移中心点继续更新

            # step3 偏移距离小于等于convergence停止漂移
            if new_L <= convergence:
                for i in range(0, len(index)):
                    #返回原图片对应的行列,在新图的相同位置使用终点位置值代替
                    row = int((temp_point[i])[3])
                    col = int((temp_point[i])[4])
                    dstimg[row][col][0] = element0
                    dstimg[row][col][1] = element1
                    dstimg[row][col][2] = element2

                rgb_array = np.delete(rgb_array, index, 0)#按行删除(index储存的就是要删除的每一行)
                flag = False
            #中心点更新
            else:
                mean_r = element0
                mean_g = element1
                mean_b = element2
                mean_x = element3
                mean_y = element4
                flag = True
        #清空上一轮r半径的漂移,准备下一轮
        temp_point = []

    #将dstimg像素值大小规定在 0-255范围内
    dstimg = np.array(dstimg, np.uint8)
    return dstimg

path7 = r'C:\Users\Administrator\Desktop\GUI2\fun\images\home.jpg'

src = cv.imread(path7)
#src2 = dist = cv.bilateralFilter(src, 0, 40, 15)
img = mean_shift(src)
#img2 = mean_shift(src2)
cv.imshow("SRC",src)
cv.imshow("Out",img)
#cv.imshow("Out2",img2)
cv.waitKey()

左图为输入图像,右图为输入图聚类后的图像
在这里插入图片描述

2.可视化界面

这里我就用阿里云盘了:某度网盘不开户员,下载龟爬速度
函数可视化界面下载链接:GUI3
https://www.aliyundrive.com/s/8fyiWHb4Sny
这里是引用
运行下图中的那个红框的py文件就能出现下面这个界面。以上函数用到的测试图像在下面包里的images文件夹下。
在这里插入图片描述
这里我还给这个可视化界面打个包
在这里插入图片描述

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

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

相关文章

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.4 实现进程缓存

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.4 实现进程缓存46.4.1 实现进程缓存46 JVM 进程缓存 46.4 实现进程缓存 46.4.1 实…

Linux从入门到进阶学习(Ⅱ):Linux基础命令

目录 1 Linux目录结构 2 命令格式 3 目录切换命令 3.1 ls命令 3.2 选项与参数 3.3 目录切换 1.cd 2.pwd 4 路径 5 创建目录命令 6 文件操作命令 6.1 创建文件 6.2 查看文件 6.3 复制文件 6.4 移动文件 6.5 删除文件 1.rm命令 2.通配符 3.root用户 7 查找命…

C语言期末集训2(大一,超基础,小猫猫大课堂的配套练习)——分支结构

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

分库分表 15 连问,你抗的住吗?

我们去面试的时候&#xff0c;几乎都会被问到分库分表。 在这里整理了分库分表的15道经典面试题&#xff0c;大家看完肯定会有帮助的。 1. 我们为什么需要分库分表 在分库分表之前&#xff0c;就需要考虑为什么需要拆分。我们做一件事&#xff0c;肯定是有充分理由的。所以得…

技术分享-应用列表性能优化

阅读文章大约需要10分钟 目录 1.背景 2.分析 3.优化 4.成果 背景 应用存在大量的列表和图片资源加载&#xff0c;如首页、喵圈、直播间广播、礼物面板等, 这些列表的性能对应用性能有着不少的影响。 分析 分析-列表架构VLayout 分析-RecycleView缓存机制 分析-RecycleVi…

【记录】Ubuntu实现逻辑卷的删除

由于我的电脑上有机械硬盘和固态硬盘&#xff0c;所以在之前安装的Centos7系统中&#xff0c;定义了逻辑卷&#xff0c;希望将机械硬盘和固态硬盘在逻辑上当作是统一的整体&#xff0c;但是正因为此操作&#xff0c;导致在重装系统过程中&#xff0c;始终无法对逻辑卷进行分区&…

m基于改进PSO粒子群优化的RBF神经网络解耦控制算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 智能控制的思想最早来自傅京孙教授[&#xff0c;他通过人机控制器和机器人方面的研究&#xff0c;首先把人工智能的自觉推理方法用于学习控制系统&#xff0c;将智能控制概括为自动控制和人工智能…

MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

SysInfo主要是通过WMI来获取系统信息的&#xff0c;但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容&#xff0c;所以需要另外想办法编程获取&#xff0c;比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32…

Spring官宣新家族成员:Spring Authorization Server

8月17日&#xff0c;Spring官方宣布 Spring Authorization Server 已正式脱离实验状态&#xff0c;并进入Spring-Project家族&#xff01; 背景 Spring Authorization Server &#xff08;以下简称 SAS&#xff09;是 Spring 团队最新开发适配 OAuth 协议的授权服务器项目&…

【react】生命周期

组件从创建到死亡会经历一些特定的阶段 React组件中包含一系列勾子函数&#xff08;生命周期回调函数&#xff09;会在特定的时候调用 我们 在定义组件时&#xff0c;会在特定的生命周期回调函数中做特定的工作 一、旧版本的生命周期 1、初始化阶段 constructor()componentWil…

CVE-2022-22965:spring参数绑定漏洞

CVE-2022-22965 博客链接&#xff1a;https://www.blog.23day.site/articles/73 漏洞说明 Spring framework 是Spring 里面的一个基础开源框架&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期,2022年3月31日&#xff0c;VMware Tanzu发布漏洞报告&#xff…

LabVIEW创建自定义书签管理器

LabVIEW创建自定义书签管理器 书签是一种特殊的标记机制&#xff0c;可以添加到VI框图中。任何以井号标签&#xff08;#&#xff09;开头的文本都将被LabVIEW自动识别为书签。这些可用于标记代码不同部分中的待办事项或未完成的任务。当您将主题标签添加框图注释时&#xff0c…

基于java的贪吃蛇游戏-计算机毕业设计

项目介绍 本游戏采用Java环境和Eclipse开发工具&#xff0c;开发了一个界面美观&#xff0c;操作简单并且功能齐全的贪食蛇游戏&#xff0c;整个游戏分为了10个类&#xff0c;实现了游戏的开始、结束、暂停&#xff0c;通过了本游戏的开发&#xff0c;达到了学习Java及Java GU…

使用新路由器有线/无线桥接旧路由器

问题描述 已有一个无线路由器&#xff0c;但信号不能满足需求&#xff0c;遂购买新路由器对其进行桥接。经过在网上搜索和实践&#xff0c;成功配置&#xff0c;将经验记录成帖。 解决方案 无线桥接 1. 打开新路由器设置界面。&#xff08;根据路由器说明说或者网上搜索对应…

新手学python,如何才能更快升职加薪,迎娶白富美,走上人生巅峰

最近在问答里发现好多咨询怎么学习python&#xff0c;或者学习难不难的问题&#xff0c;这里给大家提几点建议&#xff1a; 了解自己的目标 我开始学编程的时候&#xff0c;连基础的知识都不知道&#xff0c;小白的很&#xff01;记得我开始看教材&#xff0c;就是输入“hello…

Vue系列之使用vue init搭建前端项目

文章の目录一、执行 vue init webpack my-project 注意&#xff08;my-project&#xff09;是自己的项目名写在最后前提执行如下代码 npm install -g vue/cli-init一、执行 vue init webpack my-project 注意&#xff08;my-project&#xff09;是自己的项目名 回车既可&…

【时空融合:遥感图像】

MUSTFN: A spatiotemporal fusion method for multi-scale and multi-sensor remote sensing images based on a convolutional neural network &#xff08;MUSTFN&#xff1a;一种基于卷积神经网络的多尺度多传感器遥感影像时空融合方法&#xff09; &#xff08;第一篇关于…

毕业设计-基于大数据的电影爬取与可视化分析系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

zabbix——分布式监控系统

目录 zabbix概述 zabbix 是什么 zabbix 监控原理 zabbix常见的五个程序 zabbix端口号 安装 zabbix 5.0 部署 zabbix 服务端 部署 zabbix 客户端 自定义监控内容 在客户端创建自定义 key 在 Web 页面创建自定义监控项模板 zabbix 自动发现与自动注册 zabbix 自动发…

第十四届蓝桥杯集训——if——配套基础示例

第十四届蓝桥杯集训——if——配套基础示例 目录 第十四届蓝桥杯集训——if——配套基础示例 例题1&#xff1a;三角形任意两边之和大于第三边 例题2&#xff1a;判断回文数 例题3&#xff1a;狗的年龄 例题4&#xff1a;帐密登录 例题1&#xff1a;三角形任意两边之和大于…