区域差分信息熵:超分辨率图像质量评价的高频细节量化指标
简介这份Python源码包实现了区域差分信息熵RDE算法用于从图像局部统计特性出发评估超分辨率图像的感知质量较传统像素级误差指标更贴近人眼视觉机制。资源面向计算机视觉方向的学生、研究人员及工程师适合进行图像质量评价学习、算法复现或开发扩展。压缩包共64个文件以png图像样本、py算法脚本为主另含md说明文档与jpg流程示意图包体大小25.23MB代码结构清晰且附注释。已有38人学习浏览可作课程设计、毕设或科研入门参考。读者可获得完整可运行的RDE实现、示例图片与使用说明便于快速理解算法流程并迁移至其他图像质量评估场景。1. 区域差分信息熵一个比PSNR更懂高频细节的超分质量评价指标上周我调一个轻量级超分模型验证集PSNR涨了0.4dB把重建图和原始高清图并排放大看边缘该糊的还是糊。像素级评价指标的高分与观感脱节不是新鲜事问题出在PSNR对空间结构不敏感。区域差分信息熵RDIE是专门评价超分辨率图像感知质量的指标先取图像差分信息抓高频结构再分块统计信息熵最后与参考图的熵分布对比把“细节恢复得好不好”量化成一个分数。它适合两类从业者做超分模型对比时当第二裁判调图像增强模型时快速判断新权重是否值得保留。下文给出可直接运行的Python实现。2. 为什么PSNR和SSIM不够RDIE的三个理论支点2.1 像素级误差指标的盲区高频区域才是人眼关注的焦点PSNR的计算本质是MSE取对数它对全图每个像素的误差等权处理。一张超分图如果只在平坦区域有轻微亮度偏差MSE很小PSNR会给出高分可如果边缘区域出现振铃伪影、纹理细节丢失PSNR通常不会有剧烈变化因为边缘像素在全图占比太小。而在图像超分辨率重建的实际评测里人眼盯着的恰好是这些高频区域——发丝、草叶、建筑轮廓像素级指标对这些位置的误差几乎“看不见”。SSIM引入了亮度、对比度和结构的局部统计相似度比PSNR进了一步但它对各类失真的响应不是线性的。对边缘过冲这种“结构信息保住了但观感生硬”的情况SSIM往往给出还不错的分数。两个指标都建立在像素值的局部统计上没有直接把“高频信息是否与参考图一致”这一维度分离出来量化。RDIE补的正是这个缺口它关心的不是像素值的绝对误差而是高频差分信息的局部丰富程度。2.2 差分信息把边缘和纹理变成可测量的信号差分信息在图像处理里就是相邻像素相减水平差分dx(x,y)I(x1,y)-I(x,y)垂直差分dy(x,y)I(x,y1)-I(x,y)梯度幅值gsqrt(dx²dy²)。平坦区域g接近0边缘处g很大纹理区域g大小交错、分布复杂。超分重建的本质就是恢复这些g不为零的位置及其强度分布所以用差分图做评价基础比直接用原始像素更贴近任务目标。差分算子一般用一阶梯度。为什么不直接用拉普拉斯拉普拉斯是二阶差分对噪声比一阶差分更敏感一点椒盐噪声就会产生很大的二阶响应把纹理信息淹掉。一阶梯度幅值已经能表达边缘强度和纹理丰富度RDIE的实现通常用一阶差分配合可选的高斯预滤波来控制噪声。后面代码里的np.gradient就是中心差分等价于一阶梯度不需要额外安装库。2.3 区域信息熵用信息论量化细节密度信息熵H-Σ(p_i·log2(p_i))衡量一个分布的“混乱程度”。把差分图的直方图看成概率分布熵值大意味着差分幅度分散、结构信息丰富熵值小则意味着差分幅度集中在少数几个级别区域趋于平坦。如果只对全图算一个熵值会丢掉空间分布信息——一张左边全是纹理、右边全是天空的图像全局熵可能和一张纹理均匀分布的图像一样。所以要对图像分块让每个块给出一个熵值最终得到一张熵值空间分布图。熵值分布图的含义很直观左半边缘密集、右半平坦的图像熵图左高右低过度平滑的重建结果整体熵值偏低引入伪影的结果局部熵值忽高忽低。对比两张熵图的差异比对比两张像素图的差异更能对齐感知质量。这个思路也被用在ai对CT超分辨率重建的质控里CT影像中组织边界和纹理密度的空间分布差异用熵图能清楚暴露。2.4 RDIE的完整计算流程与评分逻辑RDIE的完整流程可以拆成五步输入HR参考图与SR重建图都先转灰度分别用一阶梯度算子计算各自的差分图将差分图按固定窗口分成互不重叠的块对每个块统计梯度幅值直方图并计算信息熵得到熵图最后比较两张熵图输出评分。评分用两个数值组合熵图的平均绝对差Mean Absolute Difference, MAD衡量SR各局部块的信息量与HR的偏差越小越好熵图的空间相关系数Spatial Correlation衡量高频结构的空间分布是否与HR吻合越接近1越好。两个数值组合能避免“整体相似但细节错位”的情况——比如SR把左上角的纹理错误复制到右下角熵值的总量可能不变MAD很小但相关系数会明显下降。注意RDIE评价的是“细节还原度”不完全等价于“主观好看”但它比PSNR更早暴露高频结构问题。3. 从公式到Python区域差分信息熵的源码实现3.1 依赖环境与函数接口设计实现RDIE只需要NumPy建议版本1.20以上。可选依赖两个SciPy用于高斯滤波Pillow用于读取图像。如果你手头是超分模型输出的ndarray直接传给函数就行不需要落到磁盘。我习惯把源码拆成三个文件rdie.py放核心函数demo.py放调用示例README.md记录参数含义和典型取值这样不管是自己维护还是给别人跑都不需要翻代码猜参数。主函数的接口设计成输入两个ndarray输出一个字典。字典里同时给熵图差异和相关系数方便后续扩展import numpy as np def rdie_score(hr_img: np.ndarray, sr_img: np.ndarray, block_size: int 16, bins: int 64, max_grad: float 255.0) - dict: 区域差分信息熵评分。 参数说明: hr_img: 高分辨率参考图形状 (H, W) 或 (H, W, C)RGB顺序。 sr_img: 超分重建图形状与 hr_img 保持一致。 block_size: 熵值统计的窗口边长默认 16。 bins: 差分直方图分箱数默认 64。 max_grad: 梯度幅值归一化上限默认 255.0。 返回值: dict包含熵图平均绝对差、空间相关系数、双方熵图均值。 hr_gray _to_gray(hr_img) sr_gray _to_gray(sr_img) hr_grad _gradient_map(hr_gray) sr_grad _gradient_map(sr_gray) hr_ent _entropy_map(hr_grad, block_size, bins, max_grad) sr_ent _entropy_map(sr_grad, block_size, bins, max_grad) entropy_diff np.mean(np.abs(sr_ent - hr_ent)) spatial_corr np.corrcoef(hr_ent.ravel(), sr_ent.ravel())[0, 1] return { entropy_diff: float(entropy_diff), spatial_corr: float(spatial_corr), hr_entropy_mean: float(hr_ent.mean()), sr_entropy_mean: float(sr_ent.mean()), }这里的接口设计有一个关键决定返回字典而不是单个数值。原因是RDIE的真实使用场景里你通常需要同时看“总量偏差”entropy_diff和“空间分布一致性”spatial_corr只看其中一个容易误判。比如一个SR图把所有纹理都磨平了熵图整体偏低MAD会变大但如果模型把纹理位置全部移动了MAD可能很小相关系数却很难看。把两个值都抛出来分析时能直接看到是幅度问题还是位置问题。3.2 灰度转换与差分图计算灰度转换用BT.601权重不用简单的三通道平均。人眼对绿色通道的亮度感知最强平均会高估蓝色通道的贡献导致后续梯度计算在蓝色主导的色块上产生偏差。差分图用np.gradient实现中心差分它不会像np.diff那样缩减数组尺寸边界处自动退化为单边差分省去手动padding的麻烦。def _to_gray(img: np.ndarray) - np.ndarray: RGB转灰度图返回float32值域保持0-255。 if img.ndim 2: return img.astype(np.float32) return (0.299 * img[..., 0] 0.587 * img[..., 1] 0.114 * img[..., 2]).astype(np.float32) def _gradient_map(gray: np.ndarray) - np.ndarray: 一阶中心差分返回梯度幅值图。 gy, gx np.gradient(gray) return np.sqrt(gx ** 2 gy ** 2)逻辑说明np.gradient在二维float32输入上返回两个数组分别是y方向和x方向的中心差分梯度幅值把两个方向的差分信息合并成一个标量场。中心差分在相邻像素间的步长是1所以梯度幅值的单位仍然是“灰度差/像素”不会因为差分实现方式不同引入额外缩放。参数说明这里没有暴露算子选择参数是因为对8bit图像来说中心差分和Prewitt算子得到的梯度幅值差异极小基本不影响最终熵值排名。如果你在做医学影像重建图像噪声水平高可以在调用_gradient_map前先做一次高斯滤波我习惯用scipy.ndimage.gaussian_filtersigma取0.8到1.2之间下面第4章会细说。3.3 分块信息熵直方图、range与边界熵图计算是整个RDIE的核心。先把梯度图裁剪成block_size的整数倍再按块统计直方图。直方图的range必须固定为(0, max_grad)不能动态取每张图的最大值——否则两张图的直方图范围不一致熵值之间没有可比性这是RDIE实现里最容易翻车的地方。def _entropy_map(grad: np.ndarray, block_size: int 16, bins: int 64, max_grad: float 255.0) - np.ndarray: 把梯度幅值图分块统计每块的信息熵。 h, w grad.shape bh, bw h // block_size, w // block_size grad_crop grad[:bh * block_size, :bw * block_size] blocks grad_crop.reshape(bh, block_size, bw, block_size) blocks blocks.transpose(0, 2, 1, 3).reshape(bh, bw, -1) ent np.zeros((bh, bw), dtypenp.float32) for i in range(bh): for j in range(bw): hist, _ np.histogram(blocks[i, j], binsbins, range(0.0, max_grad)) total hist.sum() if total 0: ent[i, j] 0.0 continue prob hist / total prob prob[prob 0] ent[i, j] float(-(prob * np.log2(prob)).sum()) return ent逻辑说明reshape和transpose的组合把裁剪后的梯度图从(bh, block_size, bw, block_size)重排成(bh, bw, block_size²)每个块的数据连续排在最后一维这样histogram一次只处理一个块的数据代码直观且不容易出错。直方图的bin宽度由bins和range共同决定range固定为0到max_gradbins64时每个bin宽度约4个灰度级。参数说明total hist.sum()而不是直接除以block_size²是因为range固定后梯度幅值超过max_grad的像素会被直方图忽略。如果某块内大量像素梯度超过255hist.sum()会小于block_size²直接用block_size²做分母会让概率和不为1计算出的熵值偏小。用hist.sum()能保证概率分布归一化。total为0的情况理论上只出现在全黑且max_grad0的输入里但防御性写法还是加上避免log2(0)给出nan。3.4 主函数把HR和SR的熵图对比起来3.1节已经给出rdie_score的主函数这里补一个完整的调用示例包含图像读取和结果打印from PIL import Image import numpy as np def demo(): hr np.array(Image.open(hr.png).convert(RGB)) sr np.array(Image.open(sr.png).convert(RGB)) result rdie_score(hr, sr, block_size16, bins64) print(fentropy_diff {result[entropy_diff]:.4f}) print(fspatial_corr {result[spatial_corr]:.4f}) if __name__ __main__: demo()逻辑说明PIL读取图像后转RGB再转ndarray传入rdie_score。如果超分模型在训练循环里直接输出张量需要先把张量detach()并转成numpy数组再调这个函数。注意输入的HR和SR形状必须一致否则两张熵图的尺寸不同np.corrcoef会直接报维度错误。参数说明block_size16是默认值适合512×512左右的测试图bins64对应约4个灰度级的直方图分辨率对8bit图像来说足够细。如果发现不同模型间的分数差异不明显可以先调大bins到128看是否被直方图粒度限制住了。4. 参数怎么调窗口大小、bins数与差分算子的取舍4.1 block_size熵图的分辨率与稳定性的权衡block_size决定熵图的空间分辨率也决定每个块内统计样本的数量。block_size8时每个块只有64个像素直方图统计噪声大熵值在块与块之间跳变明显容易出现“某一块熵值特别高、相邻块特别低”的假纹理。block_size32时每个块1024个像素熵值稳定但空间分辨率低局部细节损失会被平均掉。我实测下来16是大多数自然图像和遥感图像的甜点值。block_size每个块像素数表现适用场景864熵值波动大对局部伪影敏感但不够稳定小尺寸贴片评测16256平衡稳定性与局部性默认推荐通用超分模型对比321024熵值平滑突出区域级差异4K大图、整体观感评估另一个选择依据是图像本身的纹理尺度。人脸皮肤纹理细密block_size8更容易区分“磨皮过度”和“真实毛孔”建筑和遥感影像结构块大block_size32反而更稳。如果你做的是ai对CT超分辨率重建这类医学影像任务我建议固定用16因为CT图像的纹理尺度相对统一改参数只会增加对比时的变量。4.2 bins与max_grad跨图可比的关键参数bins控制直方图的分箱粒度。bins16时每个bin宽度约16个灰度级两个熵值差距很大的模型可能被压到同一个分数区间区分度不足bins256时每个bin宽度只有1个灰度级直方图对噪声过于敏感同一模型跑两次分数可能都不一样。64是平衡点每个bin约4个灰度级既保留区分度又不会被单像素噪声干扰。max_grad固定为255.0是一个重要的设计决定。如果把max_grad设为每张图的梯度最大值那么梯度幅值范围不同的两张图会在不同的尺度上算熵分数完全不可比。固定为255.0后所有图像的直方图都落在同一套坐标轴上熵值才有横向比较的意义。对于float类型的超分输出如果值域不在0-255先统一缩放到0-255再传入。4.3 差分算子与预滤波噪声场景下的取舍中心差分对单像素噪声敏感因为噪声像素与邻域的差分会形成虚假的高梯度。超分模型的输出往往带着轻微的振铃和高频噪声直接算梯度熵噪声会成为熵值的主要贡献者掩盖真实的纹理信息。处理办法是在计算梯度前加一个轻量级高斯滤波sigma取0.8到1.2只压掉单像素级别的高频抖动不会明显损失真实边缘。from scipy.ndimage import gaussian_filter def rdie_score_robust(hr_img: np.ndarray, sr_img: np.ndarray, sigma: float 1.0, **kwargs): 带预滤波的RDIE计算适合噪声明显的重建输出。 hr_gray gaussian_filter(_to_gray(hr_img), sigmasigma) sr_gray gaussian_filter(_to_gray(sr_img), sigmasigma) hr_grad _gradient_map(hr_gray) sr_grad _gradient_map(sr_gray) hr_ent _entropy_map(hr_grad, kwargs.get(block_size, 16), kwargs.get(bins, 64), kwargs.get(max_grad, 255.0)) sr_ent _entropy_map(sr_grad, kwargs.get(block_size, 16), kwargs.get(bins, 64), kwargs.get(max_grad, 255.0)) return { entropy_diff: float(np.mean(np.abs(sr_ent - hr_ent))), spatial_corr: float(np.corrcoef(hr_ent.ravel(), sr_ent.ravel())[0, 1]), }逻辑说明gaussian_filter对灰度图做各向同性高斯平滑sigma决定平滑半径。sigma0表示不滤波sigma1.0时对单像素噪声的抑制明显但对2像素以上的真实边缘影响很小。注意这里对HR和SR要使用相同的sigma否则两者的噪声水平不一致熵值对比会偏向滤波更重的那一方。参数说明如果你不想引入SciPy依赖可以用NumPy实现一个简单的3×3均值滤波但效果不如高斯且容易在边缘位置产生额外的平滑梯度。我建议直接装SciPy这个库在超分评测里本来就常用。5. 区域差分信息熵避坑记录5个真实场景下的坑5.1 现象梯度直方图全为零熵值输出NaN第一次跑通代码时如果输入图像包含全黑的区域且图像尺寸刚好等于block_size的整数倍那块区域的所有梯度都为0直方图里只有0这个bin有值其余bin都是0。log2(0)会直接给出nan导致整张熵图出现nan最终分数变成nan。原因概率为0的bin在信息熵公式里贡献为0但直接对0做log2运算在浮点数层面是未定义操作。解决在计算熵之前过滤掉prob为0的bin代码里用prob prob[prob 0]处理这一步虽然简单但漏掉它后续排查会耗费半小时。5.2 现象用三通道平均值转灰度彩色图像的分数与主观评测相反在彩色图像上RDIE分数可能和你的主观判断完全对不上一幅明显更清晰的SR图熵值反而更低。原因大概率出在灰度转换上——如果用img.mean(axis2)做灰度化三通道等权蓝通道的噪声会被抬高导致梯度图里出现大量虚假的高频响应。解决统一使用BT.601权重(0.299, 0.587, 0.114)代码里的_to_gray已经实现。这条在对比两个超分模型时尤其重要因为GAN类模型常会对色度通道做不同的处理策略错误的灰度权重会把色度噪声当成纹理把真实亮度边缘淹没。5.3 现象带噪声的SR图像得分虚高比HR还“好”噪声是一种高频信号梯度幅值大且分布随机信息熵天然偏高。一个被高斯噪声污染的SR图差分熵可能比干净的HR还要高RDIE会给出“重建优于参考”的荒谬结论。在ai对CT超分辨率重建这种场景里特别明显CT原始数据自带噪声如果直接把噪声也当成纹理指标就废了。解决先做轻量去噪再算RDIE。用4.3节的rdie_score_robustsigma取1.0到1.5。去噪后梯度图保留真实边缘压掉随机噪声分数才对得齐主观判断。注意HR和SR必须用相同的sigma否则引入的系统性偏差比噪声本身还大。5.4 现象图像尺寸不是block_size的整数倍边缘信息被静默丢弃当输入图像尺寸为517×513block_size16时裁剪后只剩512×512右侧5列和下侧1行的梯度信息全部丢失。如果这5列恰好包含建筑轮廓或文字边缘SR的熵图会比HR多丢一块信息spatial_corr失真分数偏低。原因_entropy_map开头用了裁剪边缘位置的中心差分本身是单边差分数值不稳定裁剪也能顺带规避。解决在调用rdie_score前把HR和SR统一resize到能被block_size整除的尺寸比如用cv2.resize或PIL的resize双线性插值即可。不要靠裁剪对齐因为裁剪会让两张图的视场不一致。5.5 现象HR和SR尺寸不一致corrcoef直接报错超分评测里常见一个错误SR输出的边长和GT不一样比如模型输出是480×480GT是512×512直接把两张图传入rdie_score熵图尺寸分别为(30,30)和(32,32)np.corrcoef处理不同长度的数组时抛出维度不匹配的异常。原因没做尺寸对齐。解决在调用rdie_score前先断言shape一致不一致时提示先resize或crop。我一般会在主函数里加一个检查如果hr_img.shape ! sr_img.shape直接抛出带有size信息的ValueError省得在模型训练流程里静默出错if hr_img.shape ! sr_img.shape: raise ValueError( fHR shape {hr_img.shape} 与 SR shape {sr_img.shape} 不一致 请先统一尺寸再计算RDIE )6. 把RDIE嵌入超分模型评测管线组合评分卡与早期停止RDIE单独用还不够它和PSNR、SSIM、LPIPS是互补关系。PSNR最能反映像素保真度SSIM反映结构相似性LPIPS通过深度特征响应衡量感知相似度RDIE则专门量化高频细节的空间分布。我在实际评测里会列一张表PSNR排在前面做粗筛低于阈值的直接淘汰通过粗筛的模型再算SSIM和LPIPS最后用RDIE的entropy_diff和spatial_corr做最终排序。这样安排的原因是RDIE对过度平滑的惩罚很敏感而这类问题往往在PSNR上分数不低。如果你的超分模型是GAN类RDIE还能帮你识别“假细节”——生成器制造的高频伪影会让熵图与HR错位spatial_corr立刻掉下来这比肉眼对比效率高得多。另一个实用做法是用RDIE做训练中的早期停止判断。超分模型训练到后期PSNR和SSIM可能还在缓慢上升但重建质量实际已经开始过拟合训练集的纹理模式。此时在验证集上每5个epoch算一次RDIE的entropy_diff连续10次没有下降就停掉best_entropy_diff float(inf) best_epoch 0 patience 10 wait 0 for epoch in range(total_epochs): train_one_epoch() sr_imgs inference(val_loader) diff 0.0 for hr, sr in zip(val_hr_list, sr_imgs): result rdie_score(hr, sr) diff result[entropy_diff] diff / len(val_hr_list) if diff best_entropy_diff: best_entropy_diff diff best_epoch epoch wait 0 save_checkpoint(model.state_dict(), fbest_rdie_epoch{epoch}.pth) else: wait 1 if wait patience: break逻辑说明这段代码用early stopping的经典逻辑在验证集上累计RDIE的entropy_diff取最小时作为最佳断点。和只看PSNR相比RDIE对“细节过度平滑”的惩罚更直接停下来的模型通常在感知质量上更符合直观判断。还有一个可视化技巧把sr_ent与hr_ent的差值画成热力图能直接看出模型在哪些区域翻车。当熵图尺寸比较大时注意设置x轴刻度步长否则matplotlib的默认刻度会挤成一团看不清——用plt.xticks(np.arange(0, w, step8))这类方式控制密度观察值大于0的色块是模型产生了虚假细节小于0的色块是细节丢失。这套RDIE实现我已经沿用了一段时间最大的感受是它不能替代主观观察但能把“哪里细节修复得不对”这个问题从黑匣子变成一个可定位的色块分布图。选超分模型时先看PSNR再用RDIE看细节两者都过关才敢上生产环境。希望这些实现经验能帮你在超分评测里少走弯路。本文还有配套的精品资源点击获取

相关新闻

飞控计算机硬实时系统设计:RTOS选型、任务调度与验证实践

飞控计算机硬实时系统设计:RTOS选型、任务调度与验证实践

1. 为什么飞控计算机必须用“硬实时”系统干飞控嵌入式这行的人,几乎每天都要跟“硬实时”这三个字打交道。飞控计算机(Flight Control Computer, FCC)是所有飞行器的大脑,它要接收陀螺、加速度计、气压计、GNSS、空速管这些传感器…

2026/10/12 10:50:52 阅读更多 →
ESP32本地工作台搭建:固件管理与串口调试实战

ESP32本地工作台搭建:固件管理与串口调试实战

搭建一个“本地工作台”这事儿,一开始我也觉得是给自己找事。SDK 摆在那儿,文档、示例、编译脚本、烧录工具一应俱全,理论上不该缺什么。可真到了维护一个 ESP32 应用平台、手里同时有好几块板子、好几个固件版本、还时不时有同事过来说“帮我…

2026/10/12 10:50:52 阅读更多 →
基恩士KV8000+XH16EC远程IO全ST编程实战

基恩士KV8000+XH16EC远程IO全ST编程实战

前阵子给客户做了一套小型自动检测设备,主站选了基恩士KV8000,现场几个工位的输入点通过XH16EC总线从站远程扩展,整个控制程序没有用梯形图,全部用ST(结构化文本)写完。项目不算复杂,但把总线组…

2026/10/12 10:50:52 阅读更多 →

最新新闻

别再盲选版本:Qwen-Image-2.1 从 bf16 到 GGUF 的显存账本一次算清

别再盲选版本:Qwen-Image-2.1 从 bf16 到 GGUF 的显存账本一次算清

别再盲选版本:Qwen-Image-2.1 从 bf16 到 GGUF 的显存账本一次算清 【免费下载链接】Qwen-Image-2.1 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/Qwen-Image-2.1 打开 Hugging Face 或镜像站下载 Qwen-Image-2.1,你会被一屏 safete…

2026/10/12 11:45:43 阅读更多 →
graphql-ruby 的 Mutation Root:定义变更入口与顺序执行机制

graphql-ruby 的 Mutation Root:定义变更入口与顺序执行机制

后端API设计 【免费下载链接】graphql-ruby Ruby implementation of GraphQL 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-ruby 点击查看 免费下载 GraphQL 的变更操作(mutation)通过 mutation 关键字发起,并由一个名…

2026/10/12 11:45:43 阅读更多 →
如何与AI游戏主持人独享一场桌游RPG:Soul of Waifu的Soul Stage骰子、隐藏剧情与战役板玩法全解

如何与AI游戏主持人独享一场桌游RPG:Soul of Waifu的Soul Stage骰子、隐藏剧情与战役板玩法全解

【免费下载链接】Soul-of-Waifu 🌌 Give a soul to your favorite characters. Soul of Waifu is a desktop roleplay & AI companion app featuring Live2D/VRM avatars, voice chat & local LLM. Evolve together across immersive chat, RPG adventures,…

2026/10/12 11:45:43 阅读更多 →
VS2015到VS2022项目迁移:csproj转换与避坑指南

VS2015到VS2022项目迁移:csproj转换与避坑指南

简介:这是一款面向.NET开发者的Visual Studio项目版本迁移工具,支持从2002到2015各版本间的源码转换,重点解决旧项目在新环境中因.NET Framework与C#语言演进导致的兼容性问题。工具可自动识别并更新.csproj等项目文件配置,界面简…

2026/10/12 11:45:43 阅读更多 →
用Python重写PL0编译器:从词法分析到运行时栈的课设详解

用Python重写PL0编译器:从词法分析到运行时栈的课设详解

简介:这份资源是南京航空航天大学编译原理课程设计的PL0编译器Python实现,主要面向正在完成编译原理课设的计算机专业学生,也适合希望通过完整项目理解编译器构建流程的自学者。资源包共8个文件,包含5个Python源文件、1个TXT文本、…

2026/10/12 11:45:43 阅读更多 →
SpringBoot高校就业信息管理系统毕设项目实战解析

SpringBoot高校就业信息管理系统毕设项目实战解析

每年到了毕业季,不管是高职还是本科,计算机专业的同学总会聚在群里问同一句话:“有没有适合当毕设的Java项目?最好能直接跑,还能改。”问的人多了,我发现大家真正需要的其实不是什么分布式、高并发的大系统…

2026/10/12 11:44:43 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →