引导滤波code
文章目录
- 1. 原理概述
- 2. 实验环节
- 2.1 验证与opencv 库函数的结果一致
- 2.2 与 双边滤波比较
- 2.3 引导滤波应用,fathering
- 2.3 引导滤波应用,图像增强
- 2.4 灰度图引导,和各自通道引导的效果差异
- 2.5 不同参数设置影响
- 3. 参考
引导滤波
1. 原理概述
引导滤波是三大保边平滑算法之一。
原理介绍参考 图像处理基础(一)引导滤波
2. 实验环节
2.1 验证与opencv 库函数的结果一致
- 引导图是单通道时的函数guided_filter(I,p,win_size,eps)
- 引导图时三通道时的函数multi_dim_guide_filter(I, p, r, eps)
- I, p的输入如果归一化 0-1之间,则eps设置为小于1的数,比如0.2,
如果没有归一化,则 eps 需要乘以 (255 * 255) - I, p应该是浮点数
- cv2.ximgproc.guidedFilter 的输入参数r是 window_size // 2
实验图像
guided_filter 和multi_dim_guide_filter 代码:
import cv2
import numpy as np
from matplotlib import pyplot as pltdef 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_Icov_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_Imean_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 qdef 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 outdef multi_dim_guide_filter_single(I, p, r, eps):"""I : 导向图,多个通道 H, W, Cp : 单个通道 H, W, 1radius : 均值滤波核长度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, bbvar_I_rr = cv2.blur(I[..., 0] * (I[..., 0]), r) - mean_I_r * (mean_I_r) + epsvar_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) + epsvar_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 * Iinvrr = 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 /= covDetinvrg /= covDetinvrb /= covDetinvgg /= covDetinvgb /= covDetinvbb /= covDet# process pmean_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, out2if __name__ == "__main__":file = r'D:\code\denoise\denoise_video\guide_filter_image\dd.png'kernel_size= 7r = kernel_size // 2eps = 0.002input = 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 / 255input = 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 = 7r = kernel_size // 2eps1 = 0.004/2eps2 = 0.002/4input = 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 = 20r = kernel_size // 2eps1 = 0.000008 / 2I = 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 = Ikernel_size = 20r = kernel_size // 2eps1 = 0.008 / 2eps2 = 0.002 / 6out0 = cv2.bilateralFilter(p, kernel_size, eps2 * 255 * 255, eps2 * 255 * 255) # 双边滤波out1 = multi_dim_guide_filter(I, p, kernel_size, (eps1 * 255 * 255)) # 多通道guideout2 = guided_filter(I, p, kernel_size, (eps1 * 255 * 255)) # 单通道各自guideout3 = cv2.ximgproc.guidedFilter(I, p, r, (eps1 * 255 * 255)) # 多通道guideout4 = (I - out0) * 2 + out0out5 = (I - out1) * 2 + out1out6 = (I - out2) * 2 + out2out7 = (I - out3) * 2 + out3out0 = 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 灰度图引导,和各自通道引导的效果差异
一致有个疑问,
- 分别用r,g,b引导各自通道的效果
- 利用灰度图引导各通道,比1滤波强度更大
- 利用彩色图引导
哪种效果更好呢? 实际使用的时候利用彩色图引导要相对复杂,计算量也更大。
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, out2def run_compare_gray_guide():file = r'D:\code\denoise\denoise_video\guide_filter_image\compare\dd.png'kernel_size = 17r = kernel_size // 2eps1 = 0.02 / 2input = 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 = 17r = kernel_size // 2eps1 = 0.02 / 2input = cv2.imread(file, 1)input = input.astype(np.float32) # 要转换为float类型index = 0for 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 += 1for 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
相关文章:
引导滤波code
文章目录1. 原理概述2. 实验环节2.1 验证与opencv 库函数的结果一致2.2 与 双边滤波比较2.3 引导滤波应用,fathering2.3 引导滤波应用,图像增强2.4 灰度图引导,和各自通道引导的效果差异2.5 不同参数设置影响3. 参考引导滤波1. 原理概述 引导…...
Leetcode.2353 设计食物评分系统
题目链接 Leetcode.2353 设计食物评分系统 Rating : 1782 题目描述 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分。 返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings类: FoodRatings(String[] foo…...
C语言学习_DAY_2_变量的定义_输入与输出
高质量博主,点个关注不迷路🌸🌸🌸! 目录 I. 变量的定义 II. 变量的赋值 III. 输出 IV. 输入 I. 变量的定义 首先,我们新建一个.c文件在Dev C中,并把之前定义好的程序框架放进去。 此时我…...
mac 安装navicat
由于各种原因发布不了链接,这里记录下,保存在了阿里云里...
RocketMQ快速入门
2.1 消息生产和消费介绍使用RocketMQ可以发送普通消息、顺序消息、事务消息,顺序消息能实现有序消费,事务消息可以解决分布式事务实现数据最终一致。RocketMQ有2种常见的消费模式,分别是DefaultMQPushConsumer和DefaultMQPullConsumer模式,这…...
【虚拟仿真】Unity3D实现从浏览器拉起本地exe程序并传参数
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近有项目需求,从浏览器调起来本地的exe程序&…...
Intel中断体系(1)中断与异常处理
文章目录概述中断与异常中断可屏蔽中断与不可屏蔽中断(NMI)异常异常分类中断与异常向量中断描述符表中断描述符中断与异常处理中断与异常处理过程堆栈切换错误码64位模式下的中断异常处理64位中断描述符64位处理器下的堆栈切换相关参考概述 中断是现代计…...
财报解读:四季度营收超预期,优步却越来越“不务正业”了
“公司第四季度的业绩表现将是强劲的”。 公布2022年第三季度财报时,优步的高管给出了这样的预告,给资本市场打了一针“强心剂”。然而有人对此表示质疑,后疫情时代,带着新模式、新车型的全新网约车公司层出不穷,车企…...
C语言-程序环境和预处理(14.2)
目录 预处理详解 1.预定义符号 2. #define 2.1 #define定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 注意事项: 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 3. #undef 4. 条件编译 4.1 单分支条件编译 4.2 多分支条件编译 4.3 判断是…...
VHDL语言基础-时序逻辑电路-计数器
目录 计数器的设计: 计数器的作用: 计数器的实现: 1、用“”函数描述: 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形: 计数器的仿真: 计数器的设计: 计数是一种最简单基本的…...
MySQL数据库07——高级条件查询
前面一章介绍了基础的一个条件的查询,如果多条件,涉及到逻辑运算,and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符 AND运算符只有当两边操作数均为True时,最后结果才为True。人们使用AND描述…...
《Terraform 101 从入门到实践》 第四章 States状态管理
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 军书十二卷,卷卷有爷名。 为什么需要状态管理 Terraform的主要作用是管理云平台上的资源ÿ…...
数据结构之二叉树
🎈一.二叉树相关概念 1.树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合,树结构通常用来存储逻辑关系为 "一对多" 的数据。例如: 关于树的几个重要概念&…...
上海亚商投顾:三大指数集体调整 消费板块逆市活跃
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日集体调整,沪指全天弱势震荡,创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…...
【2023unity游戏制作-mango的冒险】-开始画面API制作
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:游戏制作 ⭐mango的冒险-开始画面制作⭐ 文章目录⭐mango的冒险-开始画面制作⭐👨&…...
【微服务】Nacos配置管理
🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 Nacos除了可以做配置管理,同样可以当作注册中心来使用。 了解注册中心用法点击跳转👉【微服务】Nacos注册中心 一.引入 当微服务部署的实例越来越多࿰…...
【C++】类与对象理解和学习(上)
专栏放在【C知识总结】,会持续更新,期待支持🌹类是什么?类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它(实例化后才…...
Pyqt5小案例,界面与逻辑分离的小计算器程序
直接看下最终效果: 使用技术总结 使用Designer设计界面 使用pyuic5命令导出到python文件 新建逻辑处理文件,继承pyuic5导出的文件的类,在里面编写信号与槽的处理逻辑 使用Designer设计界面 要使用Designer,安装一个Python库即…...
leaflet加载KML文件,显示图形(方法2)
第049个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载KML文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共66…...
Mysql 部署 MGR 集群
0. 参考文章 官方文档: MySQL :: MySQL 8.0 Reference Manual :: 18.2 Getting Started 博客: MGR 单主模式部署教程(基于 MySQL 8.0.28) - 墨天轮 (modb.pro) mysql MGR单主模式的搭建 - 墨天轮 (modb.pro) MySQL 5.7 基于…...
迁移至其他美国主机商时需要考虑的因素
网站的可访问性是关系业务的关键因素之一。一个稳定、快速且优化良好的主机上的网站更有可能享受不间断的流量,并在谷歌的SERP中获得更好的排名。因此,在构建企业网站时,选择合适的主机商相当重要。不过就以美国主机为例,由于每个…...
【数据结构】第二章 线性表
文章目录第二章 知识体系2.1 线性表的定义和基本操作2.1.1 线性表的定义2.1.2 线性表的基本操作2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表的基本操作的实现2.3 线性表的链式表示2.3.1 单链表的定义2.3.2 单链表的基本操作实现2.3.3 双链表2.3.4 循环链表2.3.5 静态链…...
RESTful API 为何成为顶流 API 架构风格?
作者孙毅,API7.ai 技术工程师,Apache APISIX Committer 万物互联的世界充满着各式各样的 API ,如何统筹规范 API 至关重要。RESTful API 是目前世界上最流行的 API 架构风格之一,它可以帮助你实现客户端与服务端关注点分离&#x…...
Python基础知识点汇总(列表)
列表的含义 列表由一系列按特定顺序排列的元素组成,是Python中内置的可变序列。 **注:**列表的所有元素放在中括号[]中,相邻的两个元素用逗号分隔; 可将整数、实数、字符串、列表、元组等任何类型的内容放到列表中,且同一列表的元素类型可以不同。 列表的创建和删除 1.…...
新的一年软件测试行业的趋势能够更好?
如果说,2022年对于全世界来说,都是一场极大的挑战的话;那么,2023年绝对是机遇多多的一年。众所周知,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回升的趋势&#…...
Threejs中的Shadow Mapping(阴影贴图)
简而言之,步骤如下: 1.从灯光位置视点(阴影相机)创建深度图。 2.从相机的位置角度进行屏幕渲染,在每个像素点,比较由阴影相机的MVP矩阵计算的深度值和深度图的值的大小,如果深度图值小的话&…...
本质安全设备标准(IEC60079-11)的理解(四)
本质安全设备标准(IEC60079-11)的理解(四) 对于标准中“Separation”的理解 IEC60079-11使用了较长的篇幅来说明设计中需要考虑到的各种间距, 这也从一定程度上说明了间距比较重要,在设计中是需要认真考虑…...
(record)QEMU安装最小linux系统——TinyCore(命令行版)
文章目录QEMU安装最小linux系统——TinyCore参考QEMU使用qemu创建tinycore虚拟机再次启动文件保存QEMU安装最小linux系统——TinyCore 简单记录安装过程和记录点 参考 [原创] qemu 与 Tiny Core tinycore的探索 QEMU qemu不多介绍,这里是在WSL2上安装的linux版…...
C++中的cast类型转换
reinterpret_cast用法:reinpreter_cast<type-id> (expression)type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。这个操作符能够在非相关的类型之间转换。操作结果…...
西瓜数据集读取的详细解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...
ps做游戏下载网站有哪些/百度搜索量统计
泛型介绍(C# 编程指南)泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic&…...
网站开发技术协议怎么写/seo搜索引擎优化平台
图解CSS padding、margin、border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落、列表、标题、图片以及层。盒模型主要定义四个区域:内容(content)、内边距(padding)、…...
做购物网站怎么赚钱/seo和sem的区别与联系
NOIP2018 复盘 前言 在这里立一个可能无法实现的flag: 把NOIP从古至今(luogu上有)的每一年都写一篇复盘!!! 伏拉格综合征开始了 在复盘就不讲那些伤心的话了。 D1T1 铺设道路 考试时居然不知道这道题是原题…...
装修案例实景图/天津百度快速排名优化
实验三 模型机组合部件的实现(二)(实验报告格式案例) 班级 计XXXXX 姓名 wolf 学号 2021080XXXXX 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能&am…...
珠海市网站开发公司/营销网站建设制作
开发原因: 页面需要做页面统计,需要访问域。 访问域方法: using System.DirectoryServices.AccountManagement;命名空间负责管理。 MSDN:https://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement%2…...
有域名了 怎么做网站/seo建设
如果你频繁的在你的系统中安装/卸载,那么不时的清理一下你的系统是十分必要的。 在Ubuntu终端中执行如下命令:sudo apt-get autoremove屏幕输出是这个样子的: Reading package lists… DoneBuilding dependency treeReading state informatio…...