引导滤波code

news2024/11/27 13:50:36

文章目录

  • 1. 原理概述
  • 2. 实验环节
    • 2.1 验证与opencv 库函数的结果一致
    • 2.2 与 双边滤波比较
    • 2.3 引导滤波应用,fathering
    • 2.3 引导滤波应用,图像增强
    • 2.4 灰度图引导,和各自通道引导的效果差异
    • 2.5 不同参数设置影响
  • 3. 参考

引导滤波

1. 原理概述

引导滤波是三大保边平滑算法之一。
原理介绍参考 图像处理基础(一)引导滤波

2. 实验环节

2.1 验证与opencv 库函数的结果一致

  1. 引导图是单通道时的函数guided_filter(I,p,win_size,eps)
  2. 引导图时三通道时的函数multi_dim_guide_filter(I, p, r, eps)
  3. I, p的输入如果归一化 0-1之间,则eps设置为小于1的数,比如0.2,
    如果没有归一化,则 eps 需要乘以 (255 * 255)
  4. I, p应该是浮点数
  5. cv2.ximgproc.guidedFilter 的输入参数r是 window_size // 2

实验图像
在这里插入图片描述

guided_filter 和multi_dim_guide_filter 代码:


import cv2
import numpy as np
from matplotlib import pyplot as plt


def guided_filter(I,p,win_size,eps):
    '''
    %   - guidance image: I (should be a gray-scale/single channel image)
    %   - filtering input image: p (should be a gray-scale/single channel image)
    %   - local window radius: r
    %   - regularization parameter: eps
    '''
    mean_I = cv2.blur(I,(win_size,win_size))
    mean_p = cv2.blur(p,(win_size,win_size))

    mean_II = cv2.blur(I*I,(win_size,win_size))
    mean_Ip = cv2.blur(I*p,(win_size,win_size))

    var_I = mean_II - mean_I*mean_I
    cov_Ip = mean_Ip - mean_I*mean_p
    #print(np.allclose(var_I, cov_Ip))

    a = cov_Ip/(var_I+eps)
    b = mean_p-a*mean_I

    mean_a = cv2.blur(a,(win_size,win_size))
    mean_b = cv2.blur(b,(win_size,win_size))

    q = mean_a*I + mean_b
    #print(mean_II.dtype, cov_Ip.dtype, b.dtype, mean_a.dtype, I.dtype, q.dtype)
    return q


def multi_dim_guide_filter(I, p, r, eps):
    """
    I 是三通道
    p 是单通道或者多通道图像
    """
    out = np.zeros_like(p)
    if len(p.shape) == 2:
        out = multi_dim_guide_filter_single(I, p, r, eps)
    else:
        for c in range(p.shape[2]):
            out[..., c] = multi_dim_guide_filter_single(I, p[..., c], r, eps)
    return out


def multi_dim_guide_filter_single(I, p, r, eps):
    """
    I : 导向图,多个通道  H, W, C
    p : 单个通道        H, W, 1
    radius : 均值滤波核长度
    eps:
    """
    # if len(p.shape) == 2:
    #     p = p[..., None]
    r = (r, r)
    mean_I_r = cv2.blur(I[..., 0], r);
    mean_I_g = cv2.blur(I[..., 1], r);
    mean_I_b = cv2.blur(I[..., 2], r);

    # variance of  I in each local patch: the matrix Sigma in Eqn(14).
    # Note the variance in each local patch is a  3x3  symmetric matrix:
    #           rr, rg, rb
    # Sigma =   rg, gg, gb
    #           rb, gb, bb

    var_I_rr = cv2.blur(I[..., 0] * (I[..., 0]), r) - mean_I_r * (mean_I_r) + eps
    var_I_rg = cv2.blur(I[..., 0] * (I[..., 1]), r) - mean_I_r * (mean_I_g)
    var_I_rb = cv2.blur(I[..., 0] * (I[..., 2]), r) - mean_I_r * (mean_I_b)
    var_I_gg = cv2.blur(I[..., 1] * (I[..., 1]), r) - mean_I_g * (mean_I_g) + eps
    var_I_gb = cv2.blur(I[..., 1] * (I[..., 2]), r) - mean_I_g * (mean_I_b)
    var_I_bb = cv2.blur(I[..., 2] * (I[..., 2]), r) - mean_I_b * (mean_I_b) + eps

    # Inverse of Sigma + eps * I
    invrr = var_I_gg * (var_I_bb) - var_I_gb * (var_I_gb)
    invrg = var_I_gb * (var_I_rb) - var_I_rg * (var_I_bb)
    invrb = var_I_rg * (var_I_gb) - var_I_gg * (var_I_rb)
    invgg = var_I_rr * (var_I_bb) - var_I_rb * (var_I_rb)
    invgb = var_I_rb * (var_I_rg) - var_I_rr * (var_I_gb)
    invbb = var_I_rr * (var_I_gg) - var_I_rg * (var_I_rg)

    covDet = invrr * (var_I_rr) + invrg * (var_I_rg) + invrb * (var_I_rb)

    invrr /= covDet
    invrg /= covDet
    invrb /= covDet
    invgg /= covDet
    invgb /= covDet
    invbb /= covDet

    # process p
    mean_p = cv2.blur(p, r)

    mean_Ip_r = cv2.blur(I[..., 0] * (p), r)
    mean_Ip_g = cv2.blur(I[..., 1] * (p), r)
    mean_Ip_b = cv2.blur(I[..., 2] * (p), r)

    # covariance  of(I, p) in each local patch.

    cov_Ip_r = mean_Ip_r - mean_I_r * (mean_p)
    cov_Ip_g = mean_Ip_g - mean_I_g * (mean_p)
    cov_Ip_b = mean_Ip_b - mean_I_b * (mean_p)

    a_r = invrr * (cov_Ip_r) + invrg * (cov_Ip_g) + invrb * (cov_Ip_b)
    a_g = invrg * (cov_Ip_r) + invgg * (cov_Ip_g) + invgb * (cov_Ip_b)
    a_b = invrb * (cov_Ip_r) + invgb * (cov_Ip_g) + invbb * (cov_Ip_b)

    b = mean_p - a_r * (mean_I_r) - a_g * (mean_I_g) - a_b * (mean_I_b)

    return (cv2.blur(a_r, r) * (I[..., 0])
            + cv2.blur(a_g, r) * (I[..., 1])
            + cv2.blur(a_b, r) * (I[..., 2])
            + cv2.blur(b, r))

实验代码:

def compare_1_3channel(im, r, eps):
    """
    分通道进行和一起进行,结果完全一致
    """
    out1 = guided_filter(im, im, r, eps)
    out2 = np.zeros_like(out1)
    out2[..., 0] = guided_filter(im[..., 0], im[..., 0], r, eps)
    out2[..., 1] = guided_filter(im[..., 1], im[..., 1], r, eps)
    out2[..., 2] = guided_filter(im[..., 2], im[..., 2], r, eps)
    return out1, out2


if __name__ == "__main__":

    file = r'D:\code\denoise\denoise_video\guide_filter_image\dd.png'
    kernel_size= 7
    r = kernel_size // 2
    eps = 0.002

    input = cv2.imread(file, 1)
    out1, out2 = compare_1_3channel(input, kernel_size, (eps * 255 * 255))
    cv2.imwrite(file[:-4] + 'out1.png', out1)    # 这个结果错误,因为uint8 * uint8仍然赋给了uint8

    # out2.png, out3.png, out4.png 结果基本一致
    input = input.astype(np.float32)  # 要转换为float类型
    out1, out2 = compare_1_3channel(input, kernel_size, (eps * 255 * 255))
    cv2.imwrite(file[:-4] + 'out2.png', out2)

    out1[..., 0] = cv2.ximgproc.guidedFilter(input[..., 0], input[..., 0], r,  (eps * 255 * 255))
    out1[..., 1] = cv2.ximgproc.guidedFilter(input[..., 1][..., None], input[..., 1][..., None], 3,  (eps * 255 * 255))
    out1[..., 2] = cv2.ximgproc.guidedFilter(input[..., 2][..., None], input[..., 2][..., None], 3,  (eps * 255 * 255))
    print('tt : ', out1.min(), out1.max())
    out4 = np.clip(out1 * 1, 0, 255).astype(np.uint8)
    cv2.imwrite(file[:-4] + 'out4.png', out4)

    input = input / 255
    input = input.astype(np.float32)
    out1, out2 = compare_1_3channel(input, kernel_size, (eps)) # 注意0-1 和 0-255 在eps的差异。
    out3 = np.clip(out1 * 255, 0, 255).astype(np.uint8)
    cv2.imwrite(file[:-4] + 'out3.png', out3)

    # out5.png 和 out6.png结果一致,利用灰度图作为导向图, 注意半径和kernel_size的区别。
    guide= cv2.cvtColor(input,cv2.COLOR_BGR2GRAY)
    out1 = cv2.ximgproc.guidedFilter(guide, input, r, (eps))
    out5 = np.clip(out1 * 255, 0, 255).astype(np.uint8)
    cv2.imwrite(file[:-4] + 'out5.png', out5)


    out2[..., 0] = guided_filter(guide, input[..., 0], kernel_size, eps)
    out2[..., 1] = guided_filter(guide, input[..., 1], kernel_size, eps)
    out2[..., 2] = guided_filter(guide, input[..., 2], kernel_size, eps)
    out6 = np.clip(out2 * 255, 0, 255).astype(np.uint8)
    cv2.imwrite(file[:-4] + 'out6.png', out6)

    plt.figure(figsize=(9, 14))
    plt.subplot(231), plt.axis('off'), plt.title("guidedFilter error")
    plt.imshow(cv2.cvtColor(out1, cv2.COLOR_BGR2RGB))
    plt.subplot(232), plt.axis('off'), plt.title("cv2.guidedFilter")
    plt.imshow(cv2.cvtColor(out2, cv2.COLOR_BGR2RGB))
    plt.subplot(233), plt.axis('off'), plt.title("cv2.guidedFilter")
    plt.imshow(cv2.cvtColor(out3, cv2.COLOR_BGR2RGB))

    plt.subplot(234), plt.axis('off'), plt.title("cv2.guidedFilter")
    plt.imshow(cv2.cvtColor(out4, cv2.COLOR_BGR2RGB))
    plt.subplot(235), plt.axis('off'), plt.title("cv2.guidedFilter")
    plt.imshow(cv2.cvtColor(out5, cv2.COLOR_BGR2RGB))
    plt.subplot(236), plt.axis('off'), plt.title("cv2.guidedFilter")
    plt.imshow(cv2.cvtColor(out6, cv2.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

输出结果
在这里插入图片描述

2.2 与 双边滤波比较

个人感觉引导滤波更好

在这里插入图片描述

完整代码如下:

if __name__=='__main__':
    file = r'D:\code\denoise\denoise_video\guide_filter_image\dd.png'
    kernel_size = 7
    r = kernel_size // 2
    eps1 = 0.004/2
    eps2 = 0.002/4

    input = cv2.imread(file, 1)
    input = input.astype(np.float32)  # 要转换为float类型
    out1 = guided_filter(input, input, kernel_size, eps1*255*255)
    out2 = cv2.bilateralFilter(input, kernel_size, eps2*255*255, eps2*255*255)

    out1 = np.clip(out1, 0, 255).astype(np.uint8)
    out2 = np.clip(out2, 0, 255).astype(np.uint8)

    cv2.imwrite(file[:-4] + 'guide.png', out1)
    cv2.imwrite(file[:-4] + 'bi.png', out2)

    cv2.imshow("guide", out1)
    cv2.imshow("bi", out2)
    cv2.waitKey(0)

2.3 引导滤波应用,fathering

实验图像
在这里插入图片描述
在这里插入图片描述

实验code:

'''
导向滤波的应用: fathering
'''
def run_fathering():
    file_I = r'D:\code\denoise\denoise_video\guide_filter_image\apply\c.png'
    file_mask = r'D:\code\denoise\denoise_video\guide_filter_image\apply\d.png'
    I = cv2.imread(file_I, 1)
    I_gray = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)
    input = cv2.imread(file_mask, 0)

    kernel_size = 20
    r = kernel_size // 2
    eps1 = 0.000008 / 2

    I = I.astype(np.float32)
    I_gray = I_gray.astype(np.float32)
    input = input.astype(np.float32)  # 要转换为float类型

    out1 = cv2.ximgproc.guidedFilter(I, input, r, (eps1 * 255 * 255))
    out1 = np.clip(out1, 0, 255).astype(np.uint8)
    cv2.imwrite(file_mask[:-4] + 'guide.png', out1)

    out2 = cv2.ximgproc.guidedFilter(I_gray, input, r, (eps1 * 255 * 255))
    out2 = np.clip(out2, 0, 255).astype(np.uint8)
    cv2.imwrite(file_mask[:-4] + 'guide2.png', out2)

    out3 = guided_filter(I_gray, input, kernel_size, eps1 * 255 * 255)
    out3 = np.clip(out3, 0, 255).astype(np.uint8)
    cv2.imwrite(file_mask[:-4] + 'guide3.png', out3)

    print(I.shape, input.shape)
    out4 = multi_dim_guide_filter(I, input, kernel_size, eps1 * 255 * 255)
    out4 = np.clip(out4, 0, 255).astype(np.uint8)
    cv2.imwrite(file_mask[:-4] + 'guide4.png', out4)

out1 是彩色引导图,opencv库
out2 是灰度引导图,opencv库
out3 是灰度引导图,
out4 是彩色引导图

结果 out1和out4 接近一致,效果好。 out2和out3一致,效果存在问题

在这里插入图片描述

2.3 引导滤波应用,图像增强

图片
在这里插入图片描述

引导滤波结果稍好一些
实验code:

if __name__ == '__main__':
    file = r'D:\code\denoise\denoise_video\guide_filter_image\apply\e.png'
    I = cv2.imread(file, 1)
    I = I.astype(np.float32)
    p = I

    kernel_size = 20
    r = kernel_size // 2
    eps1 = 0.008 / 2
    eps2 = 0.002 / 6

    out0 = cv2.bilateralFilter(p, kernel_size, eps2 * 255 * 255, eps2 * 255 * 255)  # 双边滤波
    out1 = multi_dim_guide_filter(I, p, kernel_size, (eps1 * 255 * 255)) # 多通道guide
    out2 = guided_filter(I, p, kernel_size, (eps1 * 255 * 255))          # 单通道各自guide
    out3 = cv2.ximgproc.guidedFilter(I, p, r, (eps1 * 255 * 255))        # 多通道guide

    out4 = (I - out0) * 2 + out0
    out5 = (I - out1) * 2 + out1
    out6 = (I - out2) * 2 + out2
    out7 = (I - out3) * 2 + out3
    out0 = np.clip(out0, 0, 255).astype(np.uint8)
    out1 = np.clip(out1, 0, 255).astype(np.uint8)
    out2 = np.clip(out2, 0, 255).astype(np.uint8)
    out3 = np.clip(out3, 0, 255).astype(np.uint8)  # out3 应该和 out1结果一致

    out4 = np.clip(out4, 0, 255).astype(np.uint8)
    out5 = np.clip(out5, 0, 255).astype(np.uint8)
    out6 = np.clip(out6, 0, 255).astype(np.uint8)  #
    out7 = np.clip(out7, 0, 255).astype(np.uint8)

    cv2.imwrite(file[:-4] + '0.png', out0)
    cv2.imwrite(file[:-4] + '1.png', out1)
    cv2.imwrite(file[:-4] + '2.png', out2)
    cv2.imwrite(file[:-4] + '3.png', out3)
    cv2.imwrite(file[:-4] + '4.png', out4)
    cv2.imwrite(file[:-4] + '5.png', out5)
    cv2.imwrite(file[:-4] + '6.png', out6)
    cv2.imwrite(file[:-4] + '7.png', out7)

2.4 灰度图引导,和各自通道引导的效果差异

一致有个疑问,

  1. 分别用r,g,b引导各自通道的效果
  2. 利用灰度图引导各通道,比1滤波强度更大
  3. 利用彩色图引导

哪种效果更好呢? 实际使用的时候利用彩色图引导要相对复杂,计算量也更大。

def compare_1gray_3channel(im, r, eps):
    """
    分通道进行和一起进行,结果完全一致
    """
    out1 = guided_filter(im, im, r, eps)
    im_gray = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
    out2 = np.zeros_like(out1)

    out2[..., 0] = guided_filter(im_gray, im[..., 0], r, eps)
    out2[..., 1] = guided_filter(im_gray, im[..., 1], r, eps)
    out2[..., 2] = guided_filter(im_gray, im[..., 2], r, eps)
    return out1, out2

def run_compare_gray_guide():
    file = r'D:\code\denoise\denoise_video\guide_filter_image\compare\dd.png'
    kernel_size = 17
    r = kernel_size // 2
    eps1 = 0.02 / 2

    input = cv2.imread(file, 1)
    input = input.astype(np.float32)  # 要转换为float类型

    out1, out2 = compare_1gray_3channel(input, r, (eps1 * 255 * 255))

    out1 = np.clip(out1, 0, 255).astype(np.uint8)
    out2 = np.clip(out2, 0, 255).astype(np.uint8)

    cv2.imwrite(file[:-4] + '1.png', out1)
    cv2.imwrite(file[:-4] + '2.png', out2)

    out3 = cv2.ximgproc.guidedFilter(I, p, r, (eps1 * 255 * 255))        # 多通道
    out3 = np.clip(out3, 0, 255).astype(np.uint8)
    cv2.imwrite(file[:-4] + '3.png', out3)

2.5 不同参数设置影响

def parameter_tuning():
    file = r'D:\code\denoise\denoise_video\guide_filter_image\paramter_tuning\dd.png'
    kernel_size = 17
    r = kernel_size // 2
    eps1 = 0.02 / 2

    input = cv2.imread(file, 1)

    input = input.astype(np.float32)  # 要转换为float类型

    index = 0
    for r in np.arange(3, 21, 4):
        for eps in np.arange(0.000001, 0.00001, 0.000001):
            eps1 = eps * 255 * 255
            _, out2 = compare_1gray_3channel(input, r, eps1)

            out2 = np.clip(out2, 0, 255).astype(np.uint8)
            cv2.imwrite(file[:-4] + '{}.png'.format(index), out2)
            index += 1
        for eps in np.arange(0.2, 1, 0.1):
            eps1 = eps * 255 * 255
            _, out2 = compare_1gray_3channel(input, r, eps1)
            out2 = np.clip(out2, 0, 255).astype(np.uint8)
            cv2.imwrite(file[:-4] + '{}.png'.format(index), out2)
            index += 1

3. 参考

[1]https://zhuanlan.zhihu.com/p/438206777 有详细解释 和 C++相关代码仓库
[2]https://blog.csdn.net/huixingshao/article/details/42834939 高级图像去雾算法的快速实现, guide filter用于去雾,解释的很清楚
[3]http://giantpandacv.com/academic/传统图像/一些有趣的图像算法/OpenCV图像处理专栏六 来自何凯明博士的暗通道去雾算法(CVPR 2009最佳论文)/去雾代码
[4]https://github.com/atilimcetin/guided-filter引导滤波C++code

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

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

相关文章

VHDL语言基础-状态机设计-ASM图法状态机设计

目录 有限状态机的描述方法: ASM图: 状态转移图: 状态转移列表: MDS图: ASM图法状态机设计: ASM图的组成: 状态框: 判断框: 条件框: 状态框与条件框…

Python之FileNotFoundError: [Errno 2] No such file or directory问题处理

错误信息:FileNotFoundError: [Errno 2] No such file or directory: ../AutoFrame/temp/report.xlsx相对于当前文件夹的路径,其实就是你写的py文件所在的文件夹路径!python在对文件的操作时,需要特别注意文件地址的书写。文件的路…

上海亚商投顾:三大指数集体调整 消费板块逆市活跃

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日集体调整,沪指全天弱势震荡,创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…

渗透测试 -- 网站信息收集

数据来源 01 网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言(php、java、...)、数据库(Mysql、...)为什么要了解这些? 举个例子:发现了一…

vue3组件库项目学习笔记(八):Git 使用总结

目前组件库的开发已经接近尾声,因为这次是使用 git 进行协作的开发模式,在团队协作的时候遇到很多的问题,开发过程中发现小伙伴们对于 git 的使用还不是很熟练,这里就简单总结一下常用的 git 的操作,大致有&#xff1a…

Revit快速材质切换:同一墙面赋予不同材质的方法

一、Revit中对同一墙面赋予不同材质的方法 方法1:零件法 重点:通过工作平面面板上的设置工作平面命令选取正确的面取消勾选通过原始分类的材质,如图1所示 方法2:拆分构造层绘制一道墙体,选择创建的墙体,单击…

判断元素是否在可视区域

前言 在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如: 图片的懒加载列表的无限滚动计算广告元素的曝光情况可点击链接的预加…

关于TL431和光耦PC817反馈控制部分电阻取值计算

计算R4和R3。TL431的R端流入电流2uA,为了保证取样精度,即不让TL431的R端吸取电流参与R3和R4的分压,可以设置R4的电流大于TL431的R端吸取电流的100倍,此时工程实践上基本可以忽略掉TL431的R端吸取电流的影响了。R4电流最小为2uA*10…

CSS基础:选择器和声明样式

CSS概念 CSS(Cascading Style Sheets)层叠样式表,又叫级联样式表,简称样式表 CSS用于HTML文档中元素样式的定义 使用css让网页具有美观一致的页面 语法 CSS 规则由两个主要的部分构成:选择器和声明样式 选择器通常…

DaVinci:色度 - 亮度网格应用

调色页面:色彩扭曲器 Color:Color Warper色彩扭曲器中的色度 - 亮度 Chroma - Luma网格提供了强大且直观的调色功能,相对于色相 - 饱和度网格,色度 - 亮度网格在颜色的亮度控制上更具优势。在使用网格调色之前,最好先确…

DOM编程-复选框的全选和取消全选

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>复选框的全选和取消全选</title> </head> <body> <script type"text/javascript"> …

LoadRunner

目录 为什么需要性能测试 性能测试实施流程 常见的性能测试指标 性能测试分类 1、一般性能测试 2、负载测试 3、压力测试 LoadRunner LoadRunner包括三个组件 VUG Controller Analysis 一个网站或者app的性能差&#xff0c;用户的使用体验就会很差 常见的性能问题&a…

LabVIEW中使用.NET方法时出现错误1316

LabVIEW中使用.NET方法时出现错误1316为什么不能调用带有泛型参数的方法&#xff1f;LabVIEW不支持哪些.NET功能&#xff1f;为什么会收到以下错误&#xff1a;发生此错误的原因是正在调用LabVIEW中不支持的.NET功能。有关解决方法&#xff0c;请参阅“其他信息”部分。可以在下…

04- Matplotlib数据可视化详解 (数据库)

Matplotlib的亮点: import matplotlib.pyplot as plt # 导包plt.figure(figsize (9, 6) , 设置图片大小plt. plot(x, y), 画图绘制网格线: 线型, 颜色, 透明度plt.grid(linestyle --, color green, alpha0.75) # linestyle: 样式, color: 颜色, alpha: 透明度plt.axis(…

【堆】数据结构堆的实现(万字详解)

前言&#xff1a; 在上一期中我们讲到了树以及二叉树的基本的概念&#xff0c;有了之前的认识&#xff0c;今天我们将来具体实现一种二叉树的存储结构“堆”&#xff01;&#xff01;&#xff01; 目录1.二叉树顺序结构介绍2.堆的概念及结构3.调整算法3.1向上调整算法3.1.1算法…

消息中间件-RocketMQ入门 消息发送的三种方式

消息中间件-RocketMQ入门 消息发送的三种方式消息中间件简介应用场景常用消息中间件RocketMQ核心概念入门案例-生产者和消费者代码逻辑消息发送的三种方式同步发送异步发送一次性消息消息中间件简介 应用场景 假设现在有订单微服务和积分微服务,正常请求流程之后是不是一个订…

Java程序员:为了跳槽刷完1000道真题,想不到老板直接给我升职了

同事&#xff1a;前阵子听说你要跳槽&#xff0c;现在准备得怎么样啊&#xff1f; 程序员T&#xff1a;不跳了 同事&#xff1a;啊&#xff1f;为什么&#xff1f; 程序员T&#xff1a;涨薪了呗&#xff1f; 同事&#xff1a;真的吗&#xff1f;涨了多少&#xff1f;你自己…

DAMA数据管理知识体系指南之文档和内容管理

第10章 文档和内容管理 10.1 简介 文档和内容管理是对存储在关系数据库以外的信息的采集、存储、访问以及使用的控制活动。文档和内容管理的侧重点在完整性和访问控制上。因此&#xff0c;它与关系数据库的数据操作管理大致相同。由于多数非结构化数据与存储在结构化文件中的…

数据存储技术复习(四)未完

1.什么是NAS。一般用途服务器与NAS设备之间有何不同。NAS是一个基于IP的专用高性能文件共享和存储设备。—般用途服务器可用于托管任何应用程序&#xff0c;因为它运行的是一般用途操作系统NAS设备专用于文件服务。它具有专门的操作系统&#xff0c;专用于通过使用行业标准协议…

151、【动态规划】leetcode ——2. 01背包问题:二维数组+一维数组(C++版本)

题目描述 原题链接&#xff1a;2. 01背包问题 解题思路 &#xff08;1&#xff09;二维dp数组 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp[i][j]的含义&#xff1a; 容量为j时&#xff0c;从物品1-物品i中取物品&#xff0c;可达到的最大价值 &#xff08;2…