尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MATLAB药片缺陷检测:先背景校正与形态学,再边缘精修
简介面向图像处理初学者与 MATLAB 算法实践者的药片缺陷及有无检测案例围绕小波去噪抑制高斯噪声、自适应中值滤波应对椒盐噪声并结合形态学重构去除复杂背景再由边缘算子提取轮廓、扫描匹配定位目标并判定好坏与有无适合课程设计、实验复现与检测算法入门。压缩包共 15 个文件约 1.78MB包含 5 个 m 脚本、7 张 jpg 示例图以及 2 个 doc 和 1 个 docx 说明文档脚本与图片、文档相互配合便于对照运行和记录分析。已有 1578 人学习下载。读者可从中获得完整的 MATLAB 实现流程、去噪与形态学处理思路、边缘检测和匹配判别的代码参考以及实验图像与文字说明便于快速理解药片视觉检测的关键环节并开展二次调试。1. 药片缺陷与有无检测边缘算法为什么常常是最后一步而不是第一步在 MATLAB 里做药片缺陷检测和有无检测绝大多数人的第一版代码都长一个样灰度化、edge(I,canny)、盯着轮廓看。跑完就发现边缘东断西续药片上的裂缝和背景纹理混成一锅粥形态学操作还没上场人已经被阈值调到怀疑人生。反直觉的地方在于边缘算法本身并没有错错的是它在整条链路里的位置——真正决定检出率的是二值化之前的背景校正和之后的结构元整形边缘只负责在干净掩膜上做最后一次轮廓精修。这个先后顺序一旦搞反调多少参数都是玄学。值得把它拆开讲是因为这条链路里每一步都有明确的数学含义和明确的失效边界。知道 Otsu 为什么在这类图上必然抖、知道开运算在什么尺寸下会把真缺陷当噪声抹掉、知道 Canny 的双阈值到底在控制什么你才能在上线后遇到新批次的药片时三分钟内定位到该改哪个参数而不是把整段代码重写一遍。2. 阈值分割Otsu 在药片图像上为什么会手抖药片图有个很讨厌的特点目标药片和背景传送带或料盘都偏亮灰度差可能只有二三十级同一批药片因为料仓堆叠、光源角度、表面糖衣反光同一个药片的左半边可能是 240右半边只有 170。这种图丢给任何全局阈值方法结果都会像掷骰子。2.1 类间方差最大的三个前提药片图一个都不满足Otsu 的思路很朴素把所有可能的灰度级 t 遍历一遍把像素分成小于 t和大于 t两类算这两类的类间方差$$\sigma_b^2(t)\omega_0(t),\omega_1(t),\big[\mu_0(t)-\mu_1(t)\big]^2$$取让这个值最大的 t。其中 ω 是两类各自的像素占比μ 是两类的均值。它等价于在找一个把直方图劈得最开的位置。这个判据隐含三个前提直方图是明显双峰的、前景背景面积量级相当、全图光照均匀。药片图恰好三条全踩反光让直方图在亮区拖出一条长尾双峰被抹平成单峰加肩一整盘药片里空位多的时候背景占七成Otsu 会本能地把阈值往药片那边推光照梯度让背景这个概念本身在图上都不是一个灰度值。结果就是同一段代码上午跑阈值 0.62 能用下午换一批料阈值飘到 0.48二值图直接糊成一片。I imread(pill_batch.png); G rgb2gray(I); G imgaussfilt(G, 1.2); % sigma1.2压传感器噪声又不糊掉 2~3px 的裂缝 [counts, bins] imhist(G); % 先看直方图形态再决定要不要上全局阈值 T graythresh(G); % 返回归一化到 [0,1] 的阈值 BW imbinarize(G, T); % imbinarize 内部按类范围自动换算这里graythresh返回的是归一化阈值imbinarize拿到之后会按图像的实际数据类型换算回灰度级所以不要自己再乘 255 一次这是很常见的翻车点。imgaussfilt的 sigma 是个手感参数调到 2 以上药片崩边那种 1~2 像素宽的缺口就被平滑掉了后面再怎么调形态学也救不回来调到 0.5 以下噪点会跟着一起进二值图开运算的结构元就得被迫加大又是一轮误伤。真正该做的不是换一个更聪明的阈值算法而是先把光照不均这个变量从图里消掉让 Otsu 回到它擅长的场景。2.2 顶帽变换把光照不均从图里减出去灰度顶帽的定义是原图减去原图的开运算$$T_{hat}(f)f-(f\circ b)$$开运算在灰度图上的效果是抹掉所有装不进结构元 b 的亮结构。所以只要让结构元 b 比药片大一圈imopen得到的就是一张只剩背景照度场的图——药片被抹平了光照梯度被完整保留。原图减掉它剩下的就是那些比结构元小的亮细节也就是药片本身同时还顺手把背景拉平了。r 28; % 结构元半径取药片外接圆半径的 1.1~1.3 倍 se strel(disk, r, 0); % 第三参数 0 表示用快速圆盘近似8 最精确但慢 bg imopen(G, se); % 开运算估计背景照度场 Gt imsubtract(G, bg); % 顶帽保留比 se 小的亮结构 Gt imadjust(Gt, stretchlim(Gt, 0.01), []); % 掐掉 1% 的极值再拉伸strel(disk, r, n)里的 n 控制圆盘边界的近似程度取值 0~80 最快。对药片这种尺寸的结构元n0 带来的多边形误差远小于药片本身的形状偏差没必要为了精度把速度搭进去。半径 r 是这一整套里最敏感的参数没有之一。r 取小了药片本身装不进结构元开运算会把药片一起抹掉顶帽结果里药片变成一圈残影r 取大了背景照度场估计得过于平滑局部阴影减不干净。工程上稳妥的做法是先用regionprops量一遍正常药片的外接圆直径 D然后取 r ≈ 0.6D再在这个值上下各试两档看二值图稳定性。这个半径和后面形态学的结构元半径是两个独立概念别混着调。stretchlim的第二个参数 0.01 表示各掐掉 1% 的最暗和最亮像素再拉伸比默认的 0.01 更保守一些如果图上存在大面积高光斑可以提到 0.02避免高光把整体对比度压扁。2.3 二值化之后的第一道整形顶帽之后直方图通常能重新分出双峰这时候再上 Otsu 就稳多了。但二值图不会干净总会带一圈碎屑和几个孤立的噪点所以还需要一道最小面积过滤。T graythresh(Gt); BW imbinarize(Gt, T); BW bwareaopen(BW, 300); % 去掉面积小于 300 像素的连通块bwareaopen的第二个参数是像素面积不是物理面积必须按相机分辨率和视野换算。假设视野 100mm × 80mm、图像 1280 × 1024那 1 像素 ≈ 0.078mm药片直径 8mm 对应约 100 像素、面积约 7800 像素300 这个门槛只用来杀碎屑不会误伤正常药片。这个数一旦按看着舒服随手填后面计数就会出现忽多忽少的问题而且极难复现。3. 形态学开运算和闭运算到底在运算什么形态学在药片检测里承担的是整形角色——它不判断缺陷只负责把二值掩膜修成符合物理直觉的形状。理解它的关键是把结构元当成一根探针探针能塞进去的地方保留塞不进去的地方被改掉。3.1 腐蚀与膨胀结构元作为探针的集合含义二值腐蚀的定义是结构元 B 平移后完全包含在 A 内的所有原点位置$$A\ominus B{z\mid (B)_z\subseteq A}$$膨胀则放宽成平移后与 A 有交集$$A\oplus B{z\mid (\hat{B})_z\cap A\neq\varnothing}$$一句话概括腐蚀是只要有一个像素不满足就删膨胀是只要有一个像素满足就留。所有开闭运算都是这两步的组合没有第三种原语。结构元的形状直接决定探针的手感。strel(disk,3)是各向同性的圆盘对药片这种圆弧边界最友好strel(square,3)会带来方向偏置0° 和 45° 方向的边界被削掉的程度不一样用它算出来的圆度会系统性偏低strel(line,7,45)是定向探针专门用来抽取某个角度的裂纹或者抹掉某个方向的传送带纹路。function BWer myErode(BW, se) % 用邻域序滤波实现二值腐蚀取邻域最小值 n se.Neighborhood; % 结构元的 0/1 邻域矩阵 BWer ordfilt2(double(BW), 1, n, zeros); % order1 即取最小 BWer logical(BWer); endordfilt2的 order 参数表示取排序后的第几个值1 就是最小值——这恰好等价于邻域内只要有一个 0输出就是 0也就是腐蚀。把 order 换成sum(n(:))就变成膨胀最大值。这个等价实现的价值在于当你需要自定义非标准形状的结构元或者想在腐蚀里加权重时不用改算法框架只改邻域矩阵即可。3.2 开闭运算先开后闭还是先闭后开结果不一样开运算是先腐蚀后膨胀效果是删除装不进结构元的小岛、断开细连接、平滑凸角闭运算是先膨胀后腐蚀效果是填掉小孔、连接断裂、平滑凹角。两者都满足幂等性——imopen(imopen(A,se),se)和imopen(A,se)完全相同这一点常被用来论证多做几次没坏处但那只对单个算子成立。顺序不能随便换。先开后闭会先把细裂缝补上再填内部孔先闭后开则可能先让两块挨得很近的药片粘成一块开运算再也分不开。药片检测里的标准顺序是先开后闭先用开运算把噪点和毛刺去掉再用闭运算修补药片内部因为反光造成的黑缝。se strel(disk, 3); BW1 imopen(BW, se); % 开断细连、去毛刺、平滑外凸 BW2 imclose(BW1, se); % 闭填窄缝、连断裂、平滑内凹结构元半径的选取有一句血泪经验它必须大于噪声尺度、小于缺陷尺度。一条 2 像素宽的崩边裂缝用strel(disk,2)做开运算就足以被补平这条缺陷从此在二值图上不存在了——它不会报错也不会告警只会安安静静地变成良品。所以形态学的尺寸参数一定要拿真实缺陷样本反向验证过把已知缺陷图的裂缝宽度量出来让结构元半径明确小于它的一半。3.3 孔洞填充、连通域标记与粘连拆分imfill(BW,holes)在药片检测里是一把双刃剑。它的作用是把被前景完全包围的背景区域填成前景对压制药片表面的反光白斑很有效但药片上的刻字凹槽、真实穿孔缺陷在二值图上同样是被前景包围的背景会被一并填平。所以这一句要么放在缺陷判据之后要么干脆只对合格判定分支使用不能对所有图无脑执行。连通域标记是有无检测的核心。bwlabel的第二个参数决定邻接关系4 邻域只认上下左右8 邻域连对角也算连通。[L, num] bwlabel(BW2, 8); stats regionprops(L, Area, Centroid, BoundingBox, ... Perimeter, Eccentricity, EulerNumber); areas [stats.Area];用 8 邻域时两块只在一个角上接触的药片会被合并成一个连通域计数偏少用 4 邻域时同一块药片因为一条 1 像素的对角缝隙被劈成两个计数偏多。两个方向都错说明单靠邻接关系解决不了粘连得上距离变换加分水岭。D -bwdist(~BW2); % 距离变换取负药片中心变成谷底 D(~BW2) -Inf; % 背景强制为 -Inf防止分水岭漫到背景外 Lw watershed(D); % 在谷脊处切开 Lw(~BW2) 0; % 只保留原来前景范围内的标记bwdist算的是每个前景像素到最近背景像素的欧氏距离药片中心最大、边缘趋零。取负之后药片变成一个个坑分水岭从坑底往外漫两个坑相遇的脊线就是切割位置。这个做法对圆形药片效果很好对长条形或严重重叠的堆叠仍然会过切那种情况就得回到硬件层面——把料盘做得稀疏一点比在算法上硬扛划算得多。4. 边缘算法Sobel、LoG、Canny 在药片轮廓上的取舍边缘检测的本质是找灰度的一阶或二阶突变。药片是硬边目标理论上边缘应该很清楚实际难在反光和低对比度药片边缘的一侧是白色糖衣另一侧是浅灰背景梯度幅值可能只比噪声高一点。4.1 Sobel 梯度核与它的方向偏置Sobel 算子用两个 3×3 核分别近似 x 和 y 方向的一阶偏导$$G_x\begin{bmatrix}-101\-202\-101\end{bmatrix},\quad G_yG_x^{\mathsf T}$$拆开看它等价于先做[1 2 1]的平滑再做[-1 0 1]的差分。平滑那一步给了它一定的抗噪能力代价是定位精度只到一个像素级而且平滑核和差分核绑定改不了。Gx [-1 0 1; -2 0 2; -1 0 1]; Gy Gx; A double(Gt); Gxs imfilter(A, Gx, replicate); % replicate 边界避免黑边被当成强边缘 Gys imfilter(A, Gy, replicate); mag hypot(Gxs, Gys); % 梯度幅值 ang atan2d(Gys, Gxs); % 梯度方向用于后续非极大值抑制imfilter的边界选项默认是补零图像四周会凭空出现一条高梯度带药片贴着图像边缘时就会被误判所以显式指定replicate是必须的。hypot比sqrt(Gxs.^2Gys.^2)数值上更稳不容易在中间结果溢出。Sobel 有个容易被忽略的缺陷核的各向异性。0° 和 90° 方向的边缘梯度幅值正比于核的 L1 范数这里是 445° 方向的边缘幅值正比于对角线元素之和也是 4但核的 Frobenius 范数在两处并不相同实际响应会有约 √2 倍的差异。结果就是同一个药片的圆弧四个 45° 位置的梯度值系统性偏高做阈值分割时这四个方位的边缘会先被保留、其余方位先被丢弃圆轮廓看起来像被削了四个角。要消除这个偏置可以换 Scharr 核或者直接在梯度方向上做非极大值抑制——这正是 Canny 干的事。4.2 Canny 的双阈值滞后连接在控制什么Canny 在 Sobel 的基础上加了四步高斯平滑、非极大值抑制、双阈值、滞后连接。非极大值抑制沿着梯度方向比较相邻两点只保留局部极大把 Sobel 出来的粗边压成单像素宽双阈值把像素分成三类——高于高阈值的一定是边缘低于低阈值的一定不是夹在中间的待定滞后连接再让待定像素只要和已确认边缘连通就转正。BWc edge(Gt, canny, [0.05 0.15], 1.4);三个参数的含义分别是低阈值、高阈值都归一化到最大梯度幅值以及高斯平滑的 sigma。经验比例是低阈值取高阈值的 1/3 到 1/2比值越小边缘越连续但噪点越多。sigma 控制平滑尺度1.4 大约是 3×3 邻域的等效宽度药片边缘本身清晰的话可以降到 1.0 保留更多细节图上噪点重就提到 2.0但提到 2.5 以上崩边那种小尺度缺陷会连同噪声一起消失。滞后连接这个机制最值得琢磨。它其实是在用连通性做一次隐式的区域生长把弱边缘从孤立的噪点里救出来。副作用是一旦某条噪声链碰巧连上了真实边缘整条链都会被确认为边缘形成毛刺。药片检测里表现为轮廓外挂出一两根细线bwmorph(BWc,spur)或者一次小半径开运算就能清掉。4.3 形态学轮廓与边缘检测的分工这两者经常被混为一谈其实输出的东西完全不同。Canny 给出的是梯度突变位置的像素集合可能断、可能毛、可能不闭合形态学轮廓给出的是掩膜的边界带天然闭合、单像素宽、位置由二值图决定。se strel(disk, 1); inner BW2 ~imerode(BW2, se); % 内边界掩膜减去腐蚀后的掩膜 outer imdilate(BW2, se) ~BW2; % 外边界膨胀后的掩膜减去掩膜内边界适合算周长和圆度因为它在掩膜内部、不受背景干扰外边界适合做接触判断能反映药片膨胀出去的那一圈。而 Canny 边缘适合做亚像素级的圆拟合——药片是标准圆形用边缘点做最小二乘圆拟合能反推出亚像素精度的圆心和半径这个精度是形态学轮廓给不了的。所以合理的分工是形态学轮廓负责面积、圆度这类形状判据Canny 边缘负责圆心定位和缺失检测。两者不是替代关系硬要选一个形状判据用形态学更稳。5. 常见问题排查药片检测里最容易踩的五个坑这一节记录的都是实际调过的坑现象、原因、处理方式都对得上号。它们的共同点是代码不报错结果看起来也像那么回事只有拿标注样本回测才会暴露。5.1 分割阶段的坑坑一整批药片突然全部漏检。现象是二值图上药片只剩一圈淡淡的外环内部全是黑的regionprops算出来的面积只有正常值的三分之一。原因是顶帽变换的结构元半径取小了药片装不进结构元开运算把药片本身当成细节抹掉原图减去背景后只剩下边缘残影。解决方式是先用regionprops量出正常药片的等效直径 D把 r 提到 0.6D 以上并在换批次、换相机高度之后重新量一次——这个参数和物理尺寸绑定不是代码常量。坑二药片表面的刻字凹槽被判成穿孔缺陷。现象是每一片带刻字的药片都被标红缺陷率恒定在 100%看着特别像阈值出了问题。原因是imfill(BW,holes)那条语句把刻字槽和真实穿孔一起填平后又统一判定或者反过来在填充之前就用EulerNumber算孔洞数把刻字算成了穿孔。解决方式是把imfill移到缺陷判定之后并对孔洞加面积下限——刻字槽通常只有十几像素真实穿孔几十像素起一个bwareaopen的中间步骤就能把两者分开。坑三换了一批料计数从 120 变成 118。现象是数量总是差一两个人工复核发现有两片粘连的被算成了一片。原因是bwlabel用了 8 邻域两块只在一个角接触的药片合并成一个连通域。单纯改成 4 邻域会走向另一个极端同片药片被对角缝隙劈开。解决方式是保留 8 邻域但在标记之前跑一遍bwdist加分水岭切割同时对切割后的区域做面积校验——面积明显超过单片的说明切割失败退回人工复核。5.2 形态学与边缘阶段的坑坑四崩边缺陷稳定漏检且换阈值无效。现象是边缘带缺口的药片全部判为良品把 Otsu 阈值从 0.5 调到 0.7 也没用。原因是开运算的结构元半径大于等于裂缝宽度裂缝在二值化之后的第一道整形里就被补平了后面所有判据看到的都是一片完好的掩膜。这个坑最难查因为中间结果不落盘的话根本看不到。解决方式是把每一步的中间图都存成文件或者至少在调试模式下imshowpair出来看一眼同时把结构元半径严格限制在小于最小缺陷尺度的一半。坑五低对比度药片的边缘整片消失。现象是浅色药片在 Canny 结果里只剩下朝向光源的那半圈轮廓圆拟合直接失败。原因是双阈值的默认值edge不给阈值时自动算是按全图梯度统计出来的浅色药片那一片区域的梯度幅值整体偏低被高阈值一刀切掉低阈值又救不回来。解决方式是给edge显式传阈值并且让阈值和顶帽之后的对比度挂钩而不是依赖自动计算更稳妥的做法是把图像分块每块单独算阈值。5.3 落地阶段的坑坑六离线跑得好好的上线之后误检率翻了三倍。现象是同一段代码实验室里误检 2%产线上 6%。原因是实验室用的是静态单帧产线上是运动拍摄快门时间内有轻微运动模糊边缘梯度幅值被压低原本卡在阈值边缘的缺陷全部掉到阈值以下。解决方式是在预处理里加一次与运动方向对齐的轻微锐化或者直接把曝光时间压到运动模糊小于 0.5 像素以内——后者更根本但要在光源亮度上付出代价。6. 判据设计与取舍面积、圆度、欧拉数该用哪个到了判据这一层问题从怎么把药片分出来变成分出来之后看什么。几种常见判据各有明确的适用面也各有明确的盲区用表格摆在一起比背结论更有用。判据计算方式能抓住什么容易放过什么面积regionprops的Area缺角、半片、碎屑、空位面积相近的整体形变圆度 4πA/P²面积与周长崩边、椭圆化、拉伸表面污点、内部异物欧拉数EulerNumber穿孔、贯穿性异物边缘破损长宽比BoundingBox推算长条形碎片、断裂圆形缺陷归一化互相关normxcorr2刻字缺失、印刷偏移形变较大的缺陷圆度的公式是 4πA/P²A 是面积P 是周长圆取到 1其他形状都小于 1。周长在离散网格上会被高估实际算出来的圆度通常只有 0.85~0.92所以阈值要按实测分布定不能照抄 0.9。欧拉数的定义是连通域个数减去孔洞个数一个实心无孔区域等于 1有一个穿孔就变成 0判据直接写成EulerNumber 1即可比数孔洞简洁得多。minArea 900; maxArea 2600; % 由相机分辨率和药片直径换算留 ±15% 余量 minCirc 0.86; % 实测良品圆度分布的 5% 分位数 areas [stats.Area]; circ 4*pi*areas ./ ([stats.Perimeter].^2); holes [stats.EulerNumber]; ok areas minArea areas maxArea circ minCirc holes 1;这段判据的顺序有讲究先做面积区间筛选把碎屑和粘连块直接剔掉再做圆度和欧拉数判断。如果反过来先算圆度周长在极小面积上会被离散化误差放大到失真算出来的圆度毫无意义。holes 1这一条要放在最后因为它是唯一会受imfill影响的判据。取舍的核心在于判据不是越多越好而是要覆盖彼此的盲区。面积和圆度都描述外轮廓对内部穿孔完全无感欧拉数只看拓扑对外形崩边无感归一化互相关对刚性形变敏感、对弹性形变无能为力。三到四个互补的判据比堆十个相关性极高的特征更有效——后者只会让阈值调参变成多目标优化而产线上没人有时间做这个。还有一个经常被忽略的成本项判据的复杂度直接决定单帧处理时间。regionprops一次调用把所有属性算完比分开调用十次快得多normxcorr2在大模板下是 O(W·H·w·h)整盘药片做全图匹配基本跑不到产线速度必须先用掩膜把 ROI 抠出来再匹配。我一般会先把非匹配类的判据全部跑通、卡到 8ms 以内再决定要不要为模板匹配单独开一条分支。从那以后我每次搭这类检测链路都强制先走一遍中间图落盘灰度、顶帽、二值、开运算、闭运算、轮廓六张图按批次存下来出问题先看这六张基本三分钟内就能定位到是哪一步把缺陷吃掉了而不是从阈值开始一格一格往回猜。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

C++结构体内存对齐与填充,为什么sizeof结果和成员总和不一样?

C++结构体内存对齐与填充,为什么sizeof结果和成员总和不一样?

很多人觉得 sizeof 就是把所有成员大小相加,写代码的时候经常被结构体对齐狠狠打脸。CPU访问内存的时候,对齐地址访问效率更高。所以编译器默认会给结构体做内存对齐、内存填充。对齐规则核心两条:1. 成员的起始地址,必须是自身大…

📅 2026/11/5 5:41:20
NC6X root密码重置实战:从备份到验证的完整操作指南

NC6X root密码重置实战:从备份到验证的完整操作指南

简介:面向NC6X系统运维人员与服务器管理员的一款root密码修改辅助工具,聚焦系统最高权限账户的安全管理场景。root账户在Linux/Unix体系中权限最高,密码一旦遗忘或需定期更换,往往涉及权限管理、密码策略、审计日志与应急恢复等多…

📅 2026/11/5 5:41:20
Northstar盈富量化交易软件:开箱即用的A股本地化策略回测与实盘框架

Northstar盈富量化交易软件:开箱即用的A股本地化策略回测与实盘框架

简介:这是一款面向程序员与量化交易从业者的开源级盈富量化交易软件,专为期货、股票、外汇及加密货币等多市场自动交易场景设计,解决策略开发门槛高、接口适配复杂、风控难自主等核心痛点。资源包共1344个文件,主体为1157个Java源…

📅 2026/11/5 5:41:20
MORE NEWS

更多资讯

📰

PySceneDetect视频场景智能检测:从零开始的完整指南

PySceneDetect视频场景智能检测:从零开始的完整指南 【免费下载链接】PySceneDetect :movie_camera: Python and OpenCV-based scene cut/transition detection program & library. 项目地址: https://gitcode.com/GitHub_Trending/py/PySceneDetect PyS…

📰

palera1n 越狱完整手把手教程:从编译到还原

palera1n 越狱完整手把手教程:从编译到还原 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n palera1n 是一款面向 ar…

📰

PySceneDetect场景检测实战指南:5种核心算法与应用技巧

PySceneDetect场景检测实战指南:5种核心算法与应用技巧 【免费下载链接】PySceneDetect :movie_camera: Python and OpenCV-based scene cut/transition detection program & library. 项目地址: https://gitcode.com/GitHub_Trending/py/PySceneDetect …

📰

rea 快速指南:三条命令逆向你的第一个二进制,每个结论带证据

rea 快速指南:三条命令逆向你的第一个二进制,每个结论带证据 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea Functions 窗口…

📰

dsh-market 快速上手:DSH 插件市场 3 步装好,主题一键安装免重启

dsh-market 快速上手:DSH 插件市场 3 步装好,主题一键安装免重启 【免费下载链接】dsh-market The plugin market inside DeepSeek Harness — browse, search, one-click install DSH 可视化插件市场 项目地址: https://gitcode.com/gh_mirrors/ds/d…

📰

编译过程理解

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬