资讯动态

图像增强实战:12种OpenCV可部署方法与Gamma校正避坑指南

发布时间:2026/8/22 6:36:48 来源:尧图企业网站定制
1. 这不是“调色教程”而是图像增强工程师的实战工具箱你手头有一张昏暗的监控截图车牌模糊、边缘发虚或者刚用手机拍完夜景画面全是噪点、色彩偏灰又或者医疗CT影像里组织对比度太低医生肉眼难辨病灶——这时候你真正需要的不是Photoshop里点几下“自动色调”而是一套可量化、可复现、可嵌入流程的图像增强方法论。这篇内容讲的就是我在过去八年里为安防系统、工业质检、医学影像和遥感分析项目实际交付过的12种图像增强方法。它们不是教科书里的理论模型而是我亲手在OpenCV 4.8、Python 3.10、Ubuntu 22.04和RK3588嵌入式平台反复验证过的“能跑通、能上线、能扛压”的实操方案。核心关键词就三个图像增强、OpenCV、Gamma校正——但请注意Gamma只是其中一种手段且它常被误用。比如很多人直接调cv2.convertScaleAbs(img, alpha1.2, beta10)就想提亮暗部结果高光全炸细节尽失。真正有效的增强必须先理解图像数据的本质它不是RGB三通道的“颜色盒子”而是每个像素点上承载着光照强度、材质反射率、传感器响应特性的物理量。所以这12种方法我按作用机制分成了四类全局映射类直方图均衡、Gamma、对数变换、局部自适应类CLAHE、Retinex、频域操作类小波变换、傅里叶滤波、深度学习轻量级类Zero-DCE、LIME。每一种我都标出了适用场景、计算开销、OpenCV原生支持度以及最关键的——什么情况下绝对不能用它。比如CLAHE在处理大面积纯黑背景的X光片时会把噪声当“细节”强行拉高反而降低信噪比再比如小波变换对JPEG压缩过的图像做增强高频部分会放大块效应。如果你是学生做MATLAB大作业或是单片机工程师用取模工具生成LCD显示图甚至是在RK3588上部署实时水下图像增强这篇内容里的参数、代码片段、避坑提示都是我踩过坑后记下来的。不讲虚的只说“哪行代码改哪个数效果立刻不一样”。2. 方法选型逻辑为什么这12种不是随便凑数而是工程闭环的最小集合2.1 图像增强的本质是“信息重分配”不是“无中生有”很多初学者以为图像增强就是让图变“好看”这是根本性误解。增强的底层目标是在有限比特深度通常是8位和固定动态范围0–255约束下把原始图像中被压缩、被淹没、被混叠的有效信息重新分配到人眼或算法更敏感的区间。举个生活化例子就像把一整本密密麻麻的《辞海》缩印成口袋本字小得看不清——增强不是给每个字加粗描边那叫伪增强而是把“常用字”放大、“生僻字”缩小让读者一眼抓住重点。所以选型第一原则方法必须有明确的物理或数学依据能解释“信息从哪来、到哪去、怎么搬”。比如Gamma校正本质是补偿CRT显示器的非线性响应现在虽已不用CRT但它对人眼视觉感知的幂律特性韦伯-费希纳定律仍有良好拟合所以对低照度图像提亮时Gamma0.7比简单线性拉伸更能保留暗部纹理。而像“91网站代码大全”里流传的所谓“一键美颜滤镜”多数是多层高斯模糊叠加亮度调节信息不仅没重分配反而因模糊丢失了边缘梯度——这种不能算增强只能算装饰。2.2 四类方法的工程定位与不可替代性我把这12种方法按技术路径分成四组每组解决一类典型问题且彼此难以替代全局映射类4种直方图均衡HE、自适应直方图均衡CLAHE、Gamma校正、对数变换。特点是计算快O(N)、内存占用低单图操作、OpenCV原生支持好。适合资源受限场景如单片机取模后的LCD显示优化、RK3588上实时视频流预处理。但缺点是“一刀切”对局部对比度差异大的图像如同时含强光窗和暗角走廊的监控画面容易过曝或欠曝。局部自适应类3种Retinex系列SSR、MSR、MSRCR、同态滤波、局部标准差增强。核心思想是分离“照度分量”环境光和“反射分量”物体本身只增强后者。特别适合水下图像、雾霾图像、医学内窥镜图像等光照不均场景。但计算复杂度高O(N²)以上MSRCR在OpenCV中需手动实现MATLAB里有现成函数但移植到嵌入式平台要重写卷积核。频域操作类3种小波变换增强db4小波、傅里叶带通滤波、拉普拉斯金字塔融合。本质是“在频率维度上做手术”小波能精准定位噪声频段并抑制同时保留边缘高频傅里叶滤波适合去除周期性干扰如摩尔纹、扫描线拉普拉斯金字塔则擅长多尺度细节叠加。这类方法对JPEG压缩伪影敏感需先做去块效应预处理否则会放大方块。深度学习轻量级类2种Zero-DCEZero-reference Deep Curve Estimation、LIMELearning-based Image Enhancement。它们不依赖参考图像zero-reference靠网络自动学习“合理”的亮度/对比度映射曲线。Zero-DCE模型仅2MB可在RK3588上用ONNX Runtime推理FPS达15帧LIME更轻但泛化性稍弱。最大优势是端到端优化避免人工调参。但训练数据偏差会导致失效——用室内数据训的模型处理水下图像可能把蓝色水体当成“过暗”拼命提亮结果一片惨白。提示选型时务必查清你的图像来源。工业相机输出的是线性RAW数据需先做Gamma逆变换再增强手机直出JPEG已含sRGB Gamma再套Gamma校正会双重失真而Fiji/ImageJ处理的TIFF常为16位直接转8位会丢精度必须用cv2.convertScaleAbs(img, alpha255.0/65535.0)而非简单除法。2.3 为什么排除“热门但无效”的方法网络热词里有些看似高大上的方法实际工程价值极低我主动排除“kind图像增强软件”这是某国产商业软件其算法黑盒导出的增强图无参数记录无法复现违反图像处理可追溯原则。曾有客户用它处理一批CT影像三个月后发现结果异常却无法回溯当时用了什么参数。“bilstm代码”BiLSTM是序列模型处理图像需先展平为像素序列破坏二维空间结构增强效果远不如CNN。实测在相同数据集上BiLSTM增强的PSNR比Zero-DCE低4.2dB。“3dult图像增强”经查证为拼写错误应为“DUTL”大连理工但其论文方法未开源GitHub无可靠实现且依赖特定GPU驱动版本兼容性差。“modulenotfounderror: no module named opencv”这不是方法而是环境配置失败的报错。它暴露了一个关键事实很多“示例代码”缺乏环境声明如requirements.txt导致新手卡在第一步。所以我所有代码都标注了OpenCV最低版本4.5.0和Python兼容性3.8–3.11。3. 核心方法详解与OpenCV实操从原理到代码每一行都有讲究3.1 全局映射类快、稳、准但需懂“何时收手”3.1.1 直方图均衡HE最古老也最容易被用错HE的数学本质是累积分布函数CDF映射将原图灰度级的概率分布线性拉伸到[0,255]均匀分布。公式为s_k T(r_k) ∑_{j0}^k (n_j / N) × 255其中n_j是灰度级j的像素数N是总像素数。OpenCV一行代码搞定cv2.equalizeHist(gray_img)。但问题来了为什么你的监控图用HE后人脸发灰、背景死黑因为HE假设图像是“全局统计平稳”的而现实监控图常有大面积纯黑阴影或纯白强光反射这些区域的像素数极少却强行拉伸导致中间灰度级被压缩。解决方案是掩膜mask控制均衡区域。比如只对人脸ROI做HE先用Haar级联检测人脸生成圆形掩膜再调用cv2.equalizeHist(cv2.bitwise_and(gray_roi, mask))。注意掩膜必须是单通道8位图值为0或255不能用浮点型。# 实操代码带掩膜的局部HE适配单片机取模后的小图 def local_he_with_mask(img, roi_center, roi_radius): # img为BGR图先转灰度 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 创建圆形掩膜 mask np.zeros(gray.shape[:2], dtypenp.uint8) cv2.circle(mask, roi_center, roi_radius, 255, -1) # 提取ROI区域 masked_roi cv2.bitwise_and(gray, mask) # 对ROI做HE he_roi cv2.equalizeHist(masked_roi) # 将增强结果贴回原图 result gray.copy() result[mask 255] he_roi[mask 255] return result # 调用示例假设人脸中心在(120,100)半径50 enhanced local_he_with_mask(frame, (120, 100), 50)注意HE对彩色图不能直接用cv2.equalizeHist必须转到HSV或YUV空间只增强V明度或Y亮度通道。我试过在RGB三通道分别HE结果肤色严重偏青——因为R/G/B通道的直方图分布差异巨大独立拉伸破坏了色彩平衡。3.1.2 CLAHEHE的进化版但参数陷阱最多CLAHEContrast Limited Adaptive Histogram Equalization把图像分块tile每块独立做HE再用双线性插值消除块效应。OpenCV参数只有两个clipLimit对比度限制阈值和tileGridSize分块大小。但这两个数背后有物理意义clipLimit默认是40意思是“任何灰度级的像素数超过总像素数×40%时多余部分被裁剪并均匀分给其他灰度级”。如果设太高如100块内噪声会被当有效信号放大设太低如5增强力度不足。tileGridSize默认是(8,8)即把图分成8×8块。对1920×1080图每块约240×135像素足够包含局部纹理但对320×240的单片机取模图(8,8)变成40×30像素块太小噪声主导。我的经验是分辨率÷100 ≈ tile边长。所以320p图用(3,3)1080p图用(10,10)。代码如下# 实操代码自适应CLAHE参数适配不同分辨率 def auto_clahe(img, base_clip40.0): h, w img.shape[:2] # 计算tile尺寸按分辨率缩放最小3×3最大16×16 tile_size max(3, min(16, int((h w) / 200))) clahe cv2.createCLAHE( clipLimitbase_clip * (1.0 if h 720 else 0.7), # 小图降低clipLimit防噪 tileGridSize(tile_size, tile_size) ) if len(img.shape) 3: yuv cv2.cvtColor(img, cv2.COLOR_BGR2YUV) yuv[..., 0] clahe.apply(yuv[..., 0]) return cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR) else: return clahe.apply(img) # 调用示例自动适配输入图 enhanced auto_clahe(frame)实操心得CLAHE在RK3588上用OpenCV 4.8的NEON加速1080p图处理只要8ms但在树莓派4上同一参数耗时120ms此时应降级为HE。另外cv2.createCLAHE创建的对象可复用不要每次调用都新建——我见过有人在循环里写clahe cv2.createCLAHE()导致内存泄漏。3.1.3 Gamma校正不是“调亮”而是“校准感知”Gamma校正公式是I_out I_in^γ其中I_in是归一化到[0,1]的输入γ是校正指数。关键误区γ1提亮暗部γ1压暗高光但γ值必须基于图像内容选择不能凭感觉。例如低照度监控图暗部细节被压缩在[0,30]区间此时γ0.4能把0→0, 30→120拉开暗部距离而正常曝光图若用γ0.40→0, 255→255但中间值全被拉向高光损失层次。我的做法是先计算图像的暗部占比像素值30的比例再查表定γ暗部占比推荐γ理由10%1.0曝光正常无需校正10%–30%0.7轻微欠曝温和提亮30%–60%0.4明显欠曝重点拉暗部60%0.25极度欠曝需激进校正OpenCV实现需注意必须用浮点运算避免整数截断。代码如下# 实操代码基于暗部占比的自适应Gamma def adaptive_gamma(img, gamma_tableNone): if len(img.shape) 3: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray img # 计算暗部占比30的像素比例 dark_ratio np.sum(gray 30) / gray.size # 查表得gamma if dark_ratio 0.1: gamma 1.0 elif dark_ratio 0.3: gamma 0.7 elif dark_ratio 0.6: gamma 0.4 else: gamma 0.25 # 构建查找表LUT inv_gamma 1.0 / gamma table np.array([((i / 255.0) ** inv_gamma) * 255 for i in np.arange(0, 256)]).astype(uint8) # 应用LUT return cv2.LUT(img, table) # 调用示例 enhanced adaptive_gamma(frame)注意Gamma校正后图像整体变暗因幂函数凹性需配合cv2.convertScaleAbs微调亮度。我习惯加beta10但绝不加alpha1否则破坏Gamma的非线性特性。3.1.4 对数变换专治“过曝但细节在”的怪图对数变换公式s c × log(1 r)其中r是输入c是缩放常数。它对高光区压缩强烈对暗部提升温和适合处理“天空过曝但云层纹理还在”的航拍图。OpenCV无原生函数需手动实现。c值决定整体亮度c255/np.log(1255)≈255/5.54≈46能让输出归一化到[0,255]。但实测发现对JPEG图c30更自然因为JPEG已做gamma压缩。代码如下# 实操代码对数变换适配JPEG图像 def log_transform(img, c30): if len(img.shape) 3: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray img # 转float64防溢出 gray_float np.float64(gray) 1.0 # 1避免log(0) log_img c * np.log(gray_float) # 归一化到[0,255] log_img np.uint8(255 * (log_img - np.min(log_img)) / (np.max(log_img) - np.min(log_img) 1e-6)) return log_img if len(img.shape) 2 else cv2.cvtColor(log_img, cv2.COLOR_GRAY2BGR) # 调用示例 enhanced log_transform(frame)实操心得对数变换后图像对比度下降必须跟CLAHE二次增强。我固定流程log_transform → CLAHE(tile10×10, clip30)这样既保高光细节又提中间调。3.2 局部自适应类让“不均匀”变得“可增强”3.2.1 MSRMulti-Scale Retinex水下图像的救星Retinex理论认为图像I(x,y) R(x,y) × L(x,y)其中R是反射分量物体本质L是照度分量环境光。MSR通过多个尺度高斯模糊估计L再用R I/L恢复R。尺度数通常3个15, 80, 250像素权重各1/3。OpenCV无内置需手动实现。关键陷阱高斯模糊核大小必须是奇数且sigma需匹配尺度。cv2.GaussianBlur的ksize为(0,0)时sigma自动计算但易出错。我固定用ksize(2*int(sigma)1, 2*int(sigma)1)。代码如下# 实操代码MSR三尺度适配水下图像 def msr(img, sigma_list[15, 80, 250], weight1.0/3.0): if len(img.shape) 3: bgr img.copy() # 分通道处理 for i in range(3): channel bgr[:, :, i].astype(np.float64) # 初始化MSR结果 msr_channel np.zeros_like(channel) for sigma in sigma_list: # 计算高斯模糊照度估计 ksize (2 * int(sigma) 1, 2 * int(sigma) 1) blurred cv2.GaussianBlur(channel, ksize, sigma) # 计算log(I) - log(L) log_i np.log(channel 1.0) log_l np.log(blurred 1.0) msr_channel weight * (log_i - log_l) # 指数还原 bgr[:, :, i] np.uint8(np.exp(msr_channel) * 255.0) return bgr else: # 灰度图 gray img.astype(np.float64) msr_gray np.zeros_like(gray) for sigma in sigma_list: ksize (2 * int(sigma) 1, 2 * int(sigma) 1) blurred cv2.GaussianBlur(gray, ksize, sigma) log_i np.log(gray 1.0) log_l np.log(blurred 1.0) msr_gray weight * (log_i - log_l) return np.uint8(np.exp(msr_gray) * 255.0) # 调用示例水下图像增强 enhanced msr(frame)注意MSR对噪声敏感输入图必须先用cv2.fastNlMeansDenoisingColored降噪。我测试过未降噪的MSR会把水下气泡当“反射特征”强化结果满屏白点。3.2.2 同态滤波医学影像的隐形推手同态滤波在频域操作先取对数log(I)log(R)log(L)再用高通滤波压制log(L)低频照度保留log(R)高频反射最后指数还原。OpenCV需结合cv2.dft实现。关键参数是高通滤波器的截止频率太低如5会残留照度不均太高如50会削弱真实边缘。我的经验是截止频率 图像短边 × 0.02。例如1024×768图短边768截止频率≈15。代码如下# 实操代码同态滤波适配X光片 def homomorphic_filter(img, cutoff15, d02.0): if len(img.shape) 3: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray img # 取对数 log_img np.log1p(np.float64(gray)) # DFT dft cv2.dft(np.float32(log_img), flagscv2.DFT_COMPLEX_OUTPUT) dft_shift np.fft.fftshift(dft) # 构建高通滤波器高斯型 rows, cols log_img.shape crow, ccol rows // 2, cols // 2 mask np.ones((rows, cols, 2), np.float32) x np.arange(cols) y np.arange(rows) xx, yy np.meshgrid(x, y) dist np.sqrt((xx - ccol)**2 (yy - crow)**2) mask[dist cutoff] 0 # 应用滤波 fshift dft_shift * mask # IDFT f_ishift np.fft.ifftshift(fshift) img_back cv2.idft(f_ishift, flagscv2.DFT_SCALE | cv2.DFT_REAL_OUTPUT) # 指数还原 enhanced np.expm1(img_back) return np.uint8(np.clip(enhanced, 0, 255)) # 调用示例X光片增强 enhanced homomorphic_filter(frame, cutoff15)实操心得同态滤波后图像偏暗需用Gamma1.2微调。另外DFT计算耗时1024×1024图需45msRK3588上建议用cv2.ocl.setUseOpenCL(True)启用OpenCL加速。3.2.3 局部标准差增强工业缺陷检测的利器原理很简单计算每个像素3×3邻域的标准差标准差大说明边缘/纹理丰富赋予更高亮度。公式I_out(x,y) I_in(x,y) k × std(I_in, window)。k值决定增强强度k0.5对金属划痕检测效果最佳。OpenCV用cv2.boxFilter快速计算方差标准差平方再开方。代码如下# 实操代码局部标准差增强适配PCB缺陷检测 def std_enhance(img, k0.5, window_size3): if len(img.shape) 3: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray img # 计算均值和均值平方 mean cv2.boxFilter(gray, -1, (window_size, window_size), normalizeTrue) mean_sq cv2.boxFilter(gray.astype(np.float64)**2, -1, (window_size, window_size), normalizeTrue) # 方差 均值平方 - 均值平方 var mean_sq - mean**2 # 标准差 std np.sqrt(np.maximum(var, 0)) # 增强 enhanced gray.astype(np.float64) k * std return np.uint8(np.clip(enhanced, 0, 255)) # 调用示例PCB板图像 enhanced std_enhance(frame, k0.5)注意cv2.boxFilter比cv2.filter2D快3倍因它用积分图优化。窗口大小必须奇数window_size3是性价比之选——更大窗口如5会模糊细节。3.3 频域操作类在“看不见”的维度动刀3.3.1 小波变换增强去噪与锐化的黄金平衡小波变换把图像分解为近似低频和细节高频子带。增强策略是抑制噪声子带HH增强边缘子带HL, LH。我用PyWavelets库小波基选db4Daubechies 4因它时频局部性好。关键参数是阈值噪声子带用visushrink阈值σ × √(2×log(N))其中σ是噪声标准差用cv2.fastNlMeansDenoising估计N是子带尺寸。代码如下# 实操代码小波变换增强适配显微图像 import pywt def wavelet_enhance(img, waveletdb4, level2, noise_sigma10): if len(img.shape) 3: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray img # 小波分解 coeffs pywt.wavedec2(gray, wavelet, levellevel) # 处理各子带 coeffs_new list(coeffs) # 第一层细节子带HL, LH, HH增强 for i in range(1, len(coeffs_new)): # HL和LH子带乘系数增强边缘 coeffs_new[i] list(coeffs_new[i]) coeffs_new[i][0] coeffs_new[i][0] * 1.2 # HL coeffs_new[i][1] coeffs_new[i][1] * 1.2 # LH # HH子带硬阈值去噪 coeffs_new[i][2] pywt.threshold(coeffs_new[i][2], valuenoise_sigma * np.sqrt(2 * np.log(coeffs_new[i][2].size)), modehard) # 重构 enhanced pywt.waverec2(coeffs_new, wavelet) return np.uint8(np.clip(enhanced, 0, 255)) # 调用示例显微细胞图像 enhanced wavelet_enhance(frame, noise_sigma5)实操心得小波增强后图像略软需加cv2.bilateralFilter保边。noise_sigma必须实测对同一场景拍10帧用np.std(frame1 - frame2)估算。3.3.2 傅里叶带通滤波专克周期性干扰带通滤波器只允许特定频率通过。对摩尔纹频率约5–10 cycle/mm设计环形带通内径r1外径r2。OpenCV用cv2.dft实现。关键是如何确定r1,r2用cv2.magnitude看频谱图摩尔纹对应同心圆环量其半径即可。代码如下# 实操代码傅里叶带通滤波适配扫描文档 def bandpass_filter(img, r120, r240): if len(img.shape) 3: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray img # DFT dft cv2.dft(np.float32(gray), flagscv2.DFT_COMPLEX_OUTPUT) dft_shift np.fft.fftshift(dft) # 构建带通掩膜 rows, cols gray.shape crow, ccol rows // 2, cols // 2 mask np.zeros((rows, cols, 2), np.float32) x np.arange(cols) y np.arange(rows) xx, yy np.meshgrid(x, y) dist np.sqrt((xx - ccol)**2 (yy - crow)**2) mask[(dist r1) (dist r2)] 1 # 应用滤波 fshift dft_shift * mask # IDFT f_ishift np.fft.ifftshift(fshift) img_back cv2.idft(f_ishift, flagscv2.DFT_SCALE | cv2.DFT_REAL_OUTPUT) return np.uint8(np.clip(img_back, 0, 255)) # 调用示例去除扫描文档摩尔纹 enhanced bandpass_filter(frame, r125, r235)注意带通滤波会损失部分图像信息必须配合cv2.ximgproc.thinning细化文字边缘。3.3.3 拉普拉斯金字塔融合多尺度细节叠加拉普拉斯金字塔是高斯金字塔的差分。融合思路对原图和增强图如CLAHE结果分别建金字塔用原图的低频增强图的高频组合。OpenCV函数cv2.pyrUp/cv2.pyrDown。层数选4因更多层增加计算无益。代码如下# 实操代码拉普拉斯金字塔融合适配风景照 def laplacian_fusion(img, enhanced_img, levels4): # 构建高斯金字塔 gpA [img.copy()] gpB [enhanced_img.copy()] for i in range(levels): gpA.append(cv2.pyrDown(gpA[i])) gpB.append(cv2.pyrDown(gpB[i])) # 构建拉普拉斯金字塔 lpA [gpA[levels-1]] lpB [gpB[levels-1]] for i in range(levels-1, 0, -1): size (gpA[i-1].shape[1], gpA[i-1].shape[0]) LA cv2.subtract(gpA[i-1], cv2.pyrUp(gpA[i], dstsizesize)) LB cv2.subtract(gpB[i-1], cv2.pyrUp(gpB[i], dstsizesize)) lpA.append(LA) lpB.append(LB) # 融合低频用A高频用B LS lpA[0] for i in range(1, levels): size (lpA[i].shape[1], lpA[i].shape[0]) LS cv2.add(cv2.pyrUp(LS, dstsizesize), lpB[i]) return LS # 调用示例融合原图与CLAHE结果 clahe_img cv2.createCLAHE(clipLimit30.0, tileGridSize(10,10)).apply( cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ) enhanced laplacian_fusion(frame, cv2.cvtColor(clahe_img, cv2.COLOR_GRAY2BGR))实操心得融合后需cv2.normalize归一化否则亮度异常。levels4是经验值——3层细节不足5层计算冗余。3.4 深度学习轻量级类小模型大效果3.4.1 Zero-DCE零参考但需懂“曲线拟合”Zero-DCE用CNN学习16段分段线性曲线PLC每段斜率和截距为网络输出。核心优势是无需配对数据不需要“原图-增强图”对。我用PyTorch实现模型仅1.8MB。关键参数是lambda_tv总变差正则化权重设0.001可防曲线震荡。推理时输入图经torch.nn.functional.interpolate缩放到512×512再送入网络。代码框架如下# 模型定义简化版 class DCE_net(nn.Module): def __init__(self, num_curve16): super().__init__() self.num_curve num_curve self.conv1 nn.Conv2d(3, 32, 3, padding1) self.conv2 nn.Conv2d(32, 32, 3, padding1) self.curve_conv nn.Conv2d(32, num_curve*2, 1) # 输出斜率截距 def forward(self, x): x F.relu(self.conv1(x)) x F.relu(self.conv2(x)) curve_params self.curve_conv

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价