使用 JavaScript 对图像进行量化并提取主要颜色
前言
前段时间在 Halo 的 应用市场 中遇到希望主题和插件的封面图背景色为封面图主色的问题,于是乎需要根据封面图提取主色就想到使用 K-Means 算法来提取。
在图像处理中,图像是由像素点构成的,每个像素点都有一个颜色值,颜色值通常由 RGB 三个分量组成。因此,我们可以将图像看作是一个由颜色值构成的点云,每个点代表一个像素点。
为了更好地理解,我们可以将图像的颜色值可视化为一个 Scatter 3D 图。在 Scatter 3D 图中,每个点的坐标由 RGB 三个分量组成,点的颜色与其坐标对应的颜色值相同。
图像的颜色值量化
以下面的图片为例
它的色值分布为如下的图像
从上述 RGB 3D Scatter Plot
图如果将相似的颜色值归为一类可以看出图像大概有三种主色调蓝色、绿色和粉色:
如果我们从三簇中各选一个中心,如以 A、B、C三点表示 A(50, 150, 200)
、B(240, 150, 200)
、C(50, 100, 50)
并将每个数据点分配到最近的中心所在的簇中这个过程称之为聚类而这个中心称之为聚类中心,这样就可以得到 K 个以聚类中心为坐标的主色值。而 K-Means 算法是一种常用的聚类算法,它的基本思想就是将数据集分成 K 个簇,每个簇的中心点称为聚类中心,将每个数据点分配到最近的聚类中心所在的簇中。
K-Means
算法的实现过程如下:
-
初始化聚类中心:随机选择 K 个点作为聚类中心。
-
分配数据点到最近的聚类中心所在的簇中:对于每个数据点,计算它与每个聚类中心的距离,将它分配到距离最近的聚类中心所在的簇中。
-
更新聚类中心:对于每个簇,计算它的所有数据点的平均值,将这个平均值作为新的聚类中心。
-
重复步骤 2 和步骤 3,直到聚类中心不再改变或达到最大迭代次数。
在图像处理中,我们可以将每个像素点的颜色值看作是一个三维向量,使用欧几里得距离计算两个颜色值之间的距离。对于每个像素点,我们将它分配到距离最近的聚类中心所在的簇中,然后将它的颜色值替换为所在簇的聚类中心的颜色值,如 A1(10, 140, 170)
以距离它最近的距离中心 A 的坐标表示即 A1 = A(50, 150, 200)
。这样,我们就可以将图像中的颜色值进行量化,将相似的颜色值归为一类。
最后,我们可以根据聚类中心的颜色值,计算每个颜色值在图像中出现的次数,并按出现次数从大到小排序,取前几个颜色作为主要颜色。
<script>const img = new Image();img.src = "https://guqing-blog.oss-cn-hangzhou.aliyuncs.com/image.jpg";img.setAttribute("crossOrigin", "");img.onload = function () {const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0);const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);const data = imageData.data;const k = 3; // 聚类数const centers = quantize(data, k);console.log(centers)for (const color of centers) {const div = document.createElement("div");div.style.width = "50px";div.style.height = "50px";div.style.backgroundColor = color;document.body.appendChild(div);}};function quantize(data, k) {// 将颜色值转换为三维向量const vectors = [];for (let i = 0; i < data.length; i += 4) {vectors.push([data[i], data[i + 1], data[i + 2]]);}// 随机选择 K 个聚类中心const centers = [];for (let i = 0; i < k; i++) {centers.push(vectors[Math.floor(Math.random() * vectors.length)]);}// 迭代更新聚类中心let iterations = 0;while (iterations < 100) {// 分配数据点到最近的聚类中心所在的簇中const clusters = new Array(k).fill().map(() => []);for (let i = 0; i < vectors.length; i++) {let minDist = Infinity;let minIndex = 0;for (let j = 0; j < centers.length; j++) {const dist = distance(vectors[i], centers[j]);if (dist < minDist) {minDist = dist;minIndex = j;}}clusters[minIndex].push(vectors[i]);}// 更新聚类中心let converged = true;for (let i = 0; i < centers.length; i++) {const cluster = clusters[i];if (cluster.length > 0) {const newCenter = cluster.reduce((acc, cur) => [acc[0] + cur[0],acc[1] + cur[1],acc[2] + cur[2],]).map((val) => val / cluster.length);if (!equal(centers[i], newCenter)) {centers[i] = newCenter;converged = false;}}}if (converged) {break;}iterations++;}// 将每个像素点的颜色值替换为所在簇的聚类中心的颜色值for (let i = 0; i < data.length; i += 4) {const vector = [data[i], data[i + 1], data[i + 2]];let minDist = Infinity;let minIndex = 0;for (let j = 0; j < centers.length; j++) {const dist = distance(vector, centers[j]);if (dist < minDist) {minDist = dist;minIndex = j;}}const center = centers[minIndex];data[i] = center[0];data[i + 1] = center[1];data[i + 2] = center[2];}// 计算每个颜色值在图像中出现的次数,并按出现次数从大到小排序const counts = {};for (let i = 0; i < data.length; i += 4) {const color = `rgb(${data[i]}, ${data[i + 1]}, ${data[i + 2]})`;counts[color] = counts[color] ? counts[color] + 1 : 1;}const sortedColors = Object.keys(counts).sort((a, b) => counts[b] - counts[a]);// 取前 k 个颜色作为主要颜色return sortedColors.slice(0, k);}function distance(a, b) {return Math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2);}function equal(a, b) {return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];}
</script>
自动选取 K 值
在实际应用中,我们可能不知道应该选择多少个聚类中心,即 K 值。一种常用的方法是使用 Gap 统计量法,它的基本思想是比较聚类结果与随机数据集的聚类结果之间的差异,选择使差异最大的 K 值。
Gap 统计量法的实现过程如下:
-
对原始数据集进行 K-Means 聚类,得到聚类结果。
-
生成 B 个随机数据集,对每个随机数据集进行 K-Means 聚类,得到聚类结果。
-
计算聚类结果与随机数据集聚类结果之间的差异,使用 Gap 统计量表示。
-
选择使 Gap 统计量最大的 K 值。
下面是使用 JavaScript 实现 Gap 统计量法的示例代码:
function gap(data, maxK) {const gaps = [];for (let k = 1; k <= maxK; k++) {const quantized = quantize(data, k);const gap = logWk(quantized) - logWk(randomData(data.length));gaps.push(gap);}const maxGap = Math.max(...gaps);return gaps.findIndex((gap) => gap === maxGap) + 1;
}function logWk(quantized) {const counts = {};for (let i = 0; i < quantized.length; i++) {counts[quantized[i]] = counts[quantized[i]] ? counts[quantized[i]] + 1 : 1;}const n = quantized.length;const k = Object.keys(counts).length;const wk = Object.values(counts).reduce((acc, cur) => acc + cur * Math.log(cur / n), 0);return Math.log(n) + wk / n;
}function randomData(n) {const data = new Uint8ClampedArray(n * 4);for (let i = 0; i < data.length; i++) {data[i] = Math.floor(Math.random() * 256);}return data;
}
使用:
const k = gap(data, 10)
// const k = 3; // 聚类数
const centers = quantize(data, k);
好吧,挺麻烦的,最终直接将封面图再作为背景图添加 backdrop-filter 来实现了 🤐。
附录
Python 绘制图片 Scatter 3D:
import matplotlib.pyplot as plt
import numpy as npfrom mpl_toolkits.mplot3d import Axes3Ddef visualize_rgb(image_path):image = plt.imread(image_path)height, width, _ = image.shape# Reshape the image array to a 2D array of pixelspixels = np.reshape(image, (height * width, 3))# Extract RGB valuesred = pixels[:, 0]green = pixels[:, 1]blue = pixels[:, 2]# Create 3D scatter plotfig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(red, green, blue, c=pixels/255, alpha=0.3)ax.set_xlabel('Red')ax.set_ylabel('Green')ax.set_zlabel('Blue')ax.set_title('RGB 3D Scatter Plot')plt.show()# 调用函数并传入图像路径
visualize_rgb('image.jpg')
相关文章:
使用 JavaScript 对图像进行量化并提取主要颜色
前言 前段时间在 Halo 的 应用市场 中遇到希望主题和插件的封面图背景色为封面图主色的问题,于是乎需要根据封面图提取主色就想到使用 K-Means 算法来提取。 在图像处理中,图像是由像素点构成的,每个像素点都有一个颜色值,颜色值…...
C++20三向比较运算符详解
三向比较运算符可以用于确定两个值的大小顺序,也被称为太空飞船操作符。使用单个表达式,它可以告诉一个值是否等于,小于或大于另一个值。 它返回的是类枚举(enumeration-like)类型,定义在 <compare> …...
前端Web-JavaScript(下)
主要是补全一下JavaScript 基本对象: String对象 语法格式 方式1: var 变量名 new String("…") ; //方式一 例如: var str new String("Hello String"); 方式2: var 变量名 … ; //方式二 例如: var …...
The operation was rejected by your operating system. code CERT_HAS_EXPIRED报错解决
各种报错,试了清缓存,使用管理员权限打开命令行工具,更新npm,都不好使 最终解决:删除 c:/user/admin/ .npmrc...
【Stable Diffusion】(基础篇九)—— 扩展
扩展 本系列博客笔记主要参考B站nenly同学的视频教程,传送门:B站第一套系统的AI绘画课!零基础学会Stable Diffusion,这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 添加一些SD对应的扩展&am…...
WPF中使用定时器更新元素-DispatcherTimer
在WPF中使用定时器来更新UI元素是一种常见且有用的做法,特别是当你需要基于时间间隔来刷新数据或执行某些操作时。DispatcherTimer是WPF中用于在UI线程上执行周期性任务的理想选择,因为它确保了对UI元素的更新是线程安全的 例子程序 每隔0.5s 界面中的…...
GuLi商城-新增商品-获取分类下所有分组以及属性
/*** 根据分类id查询出所有的分组以及这些组里面的属性* @param catelogId* @return*/ @Override public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {//1、查询分组信息List<AttrGroupEntity> attrGroupEntities = this.list(…...
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
单链表理论知识详解 文章目录 单链表理论知识详解1.单链表的定义2.单链表的初始化3.单链表的插入和删除3.1 单链表的插入3.1.1 按位序插入3.1.2 在指定结点的前后插入一.后插操作二.前插操作 4.单链表的删除4.1 按位序删除4.2 指定结点的删除 5.单链表的查找5.1 按位序查找5.2 …...
QTableWidget的使用(可多行输入)
效果展示 源码 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class QTableWidget; class MainWindow : public QWidget {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();private:void insertTableRow(const QSt…...
Unity复制对象时让私有变量也被复制的简单方法
Unity复制对象时,如果一个变量为公共变量(public),那么这个变量的值会被复制到新的对象中去,但是如果一个变量是私有变量(private),默认是不会被复制的,如果希望被复制&a…...
【python】__init__方法中初始化变量__init__(self, a)
在Python类中,可以在def方法中使用属性定义变量a,并在__init__方法中初始化它作为参数。以下是一个示例: class MyClass:def __init__(self, a):self.a adef print_a(self):print(self.a)# 创建类的实例,并传入参数 obj MyClas…...
ShardingSphere中的ShardingJDBC常见分片算法的实现
文章目录 ShardingJDBC快速入门修改雪花算法和分表策略核心概念分片算法简单INLINE分片算法STANDARD标准分片算法COMPLEX_INLINE复杂分片算法CLASS_BASED自定义分片算法HINT_INLINE强制分片算法 注意事项 ShardingJDBC Git地址 快速入门 现在我存在两个数据库,并…...
对于深度学习中训练模型的体会
训练模型的流程是什么 1、数据预处理:包括数据清洗、划分数据集 、数据增强等 2、定义模型 3、定义损失函数和优化器 4、配置超参数 5、开始训练,观察训练损失和验证损失 6、根据训练结果重新调整超参数或者网络直到模型性能满意 训练集、测试集、验证集…...
Vue的路由实现模式:hash模式和history模式
1、hash模式:在浏览器中符号“#”, #以及#后面的字符称之为hash, 用window.location.hash读取。 特点:hash虽然在URL中, 但不被包括在HTTP请求中;用来 指导浏览器动作,对服务端安全无用…...
力扣SQL50 按日期分组销售产品 group_concact
Problem: 1484. 按日期分组销售产品 👨🏫 参考题解 select sell_date, count(distinct product) num_sold,group_concat(distinct product order by productseparator ,) products from activities group by sell_date...
GraphSAGE (SAmple and aggreGatE)知识总结
1.前置知识 inductive和transductive 模型训练: Transductive learning在训练过程中已经用到测试集数据(不带标签)中的信息,而Inductive learning仅仅只用到训练集中数据的信息。 模型预测: Transductive learning只能…...
自动气象站:高度自动化、智能化和精准化
自动气象站,作为科技进步的产物,以其高度的自动化、智能化和精准化特点,极大地提升了气象观测的效率和准确性。它集成了多种高精度传感器,能够全天候、不间断地监测温度、湿度、气压、风速、风向、降水量等关键气象要素࿰…...
华为的流程体系
缘由 2010年,华为销售额为1850亿元,其中国际市场占65%,净利润238亿元。当时,公司员工达11万人,公司处理合同达5万多个,290万个订单,大量的工作是手工处理,没有统一的流程支持&#…...
深度学习之参数初始化问题
参数初始化 1、 参数初始化可以减缓梯度爆炸和梯度消失问题 2、tanh一般使用Xavier初始化方法 3、Relu及其变种使用Kaiming初始化方法 V a r ( X ) E ( X 2 ) − E ( X ) 2 V a r ( X Y ) V a r ( X ) V a r ( Y ) , 当 X 和 Y 互相独立 V a r ( X Y ) V a r ( X ) V a r…...
windows C++-C++/WinRT
C/WinRT 是 Windows 运行时 (WinRT) API 的完全标准新式 C17 语言实现,以基于头文件的库的形式实现,旨在为你提供对新式 Windows API 的一流访问。 利用 C/WinRT,你可以采用任何符合标准的 C17 编译器创作和使用 Windows 运行时 API。 Window…...
GPT-SoVITS - few shot 声音克隆
文章目录 一、关于 GPT-SoVITS功能: 二、安装1、Windows2、Linux3、macOS4、手动安装4.1 安装依赖4.2 安装 FFmpegConda 用户Ubuntu/Debian 用户Windows 用户MacOS 用户 5、在 Docker 中使用5.1 docker-compose.yaml 设置5.2 通过 docker compose 运行5.3 通过 dock…...
certbot 安装
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 certbot 安装 使用python3 python3 -m pip install --upgrade pippip3 install certbotQ: ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrad…...
[Git][分支管理][上]详细讲解
目录 1.理解分支2.创建分支3.切换分支4.合并分支5.删除分支 1.理解分支 感性理解:分支可以理解为平行宇宙,但是在用户需要的时候,可以将两个平行宇宙合并,此时两个平行宇宙的效果将会"叠加"理性理解:每次提…...
基于YOLOv8的高压输电线路异物检测系统
基于YOLOv8的高压输电线路异物检测系统 (价格88) 包含 【“鸟窝”,“风筝”,“气球”,“垃圾”】 4个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数…...
算法效率的分析
一、输入规模与执行次数 1.输入规模就是一个程序输入次数,或者是一个方法的形参。 2.执行次数就是程序中代码的执行次数 #include<stdio.h> //1.输入规模与执行次数的分析(n与T之间的关系) void print1(int n){//n就是print1方法的输入规模 printf("he…...
C++的STL简介(三)
目录 1.vector的模拟实现 1.1begin() 1.2end() 1.3打印信息 1.4 reserve() 1.5 size() 1.6 capacity() 1.7 push_back() 1.8[ ] 1.9 pop_back() 1.10 insert&…...
【时时三省】(C语言基础)函数递归练习
山不在高,有仙则名。水不在深,有龙则灵。 ——csdn时时三省 求字符串长度 求的是arr里面字符串的长度 abc后面还有一个\0为结束标志 在结算字符串长度的时候不算\0 所以它的长度是3 模拟实现一个strlen函数 str等于\0的时候就会结束返回count 如果…...
C# Unity 面向对象补全计划 之 单例模式
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 了解我的专栏C#面向对象与进阶:http://t.csdnimg.cn/mIitr,尤其是关于类的那篇文章即…...
小程序电商平台开发指南:从产品设计到技术实现
文章目录 一、引言二、产品设计2.1 商品展示2.2 购物车2.3 订单管理 三、交互设计3.1 导航3.2 动画 四、技术实现4.1 技术架构4.2 数据管理4.3 性能优化4.3.1 代码优化4.3.2 资源优化4.3.3 网络优化 五、总结 一、引言 随着移动互联网的快速发展,小程序电商平台已经…...
基于微信小程序的宠物服务平台(系统源码+lw+部署文档+讲解等)
文章目录 目录 详细视频演示 系统详细设计截图 微信小程序系统的实现 1.1系统前台功能的实现 2.1微信小程序开发环境搭建 2.2微信开发者工具 2.3程序应用相关技术和知识 2.3.1小程序目录结构以及框架介绍 2.3.2 Java技术 2.3.3 MySQL数据库 2.3.4 SSM框架 源码获…...
基于MPC在线优化的有效集法位置控制器simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 模型预测控制是一种基于模型的优化控制方法,它利用过程模型预测未来行为,并通过求解一个优化问题来确定最优控制序列。MPC的特点在于它能够处理系统的动…...
web小游戏开发:拼图(四)对调和移动拼图玩法的实现
web小游戏开发:拼图(四)对调和移动拼图玩法的实现 对调方式对调模式实现移动方式移动的实现小结对调方式 在完成了原始拼图玩法后,剩下两个玩法其实相对就变得简单的多了。 对调模式,简单来说,就是选中两个图块,然后位置对调一下。 那么,我们来整理一下,看看需要哪…...
从新手到高手:Scala函数式编程完全指南,Scala 文件 I/O(27)
1、Scala 文件 I/O Scala 进行文件写操作,直接用的都是 java中 的 I/O 类 (java.io.File): import java.io._object Test {def main(args: Array[String]) {val writer new PrintWriter(new File("test.txt" ))writer.write(&qu…...
运动控制卡
运动控制轴卡(通常称为运动控制卡或运动控制轴模块)是用于控制机械设备(如电机、伺服系统和步进电机)的专用硬件。它们通常集成了运动控制算法,可以独立或与主控系统配合使用,负责生成运动轨迹、执行运动命…...
【MySQL】常用数据类型
目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar 日期和时间类型 enum和set 数据类型 数据类型分类 数值类型 tinyint类型 tinyint类型只占用一个字节类似于编程语言中的字符char。有带符号和无符号两…...
CVPR24《Neural Markov Random Field for Stereo Matching》
论文地址: https://arxiv.org/abs/2403.11193 源码地址: https://github.com/aeolusguan/NMRF 概述 手工设计的MRF模型在传统的立体匹配中占据主导地位,但与端到端的深度学习模型相比,其建模准确性不足。尽管深度学习大大改进了MR…...
【Python学习手册(第四版)】学习笔记12-if语句(and、or、三元表达式)详解
个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单,对if语句的格式、示例、多路做了示例,以及真值测试(and、or等)介绍,最后介绍了三三元表达式…...
IO多路转接
文章目录 五种IO模型fcntl多路转接selectpollepollepoll的工作模式 五种IO模型 阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式.阻塞IO是最常见的IO模型。非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULD…...
Useless Fan
灵感来源于老外的一个作品,但是只有风扇功能,除了袖珍感觉没啥用。 在淘宝上十几块买了一堆原件,于是手痒,自己手搓了一个,设计了个简单的3D打印外壳。 包括3大功能:风扇,充电宝(2…...
unity 小怪播放动画导致ui抖动
我的血条的canvas是使用World Space模式,然后点位挂载到小怪里的,小怪会自己走来走去,血条ui也是实时更新,z轴和相机平行。一开始大概是长下面这个样子的,一直忙活背包ui的学习,没怎么看战斗,结…...
如何解决部分设备分辨率不适配
1)如何解决部分设备分辨率不适配 2)Unity中如何实现草的LOD 3)使用了Play Asset Delivery提交版本被Google报错 4)如何计算弧线弹道的落地位置 这是第396篇UWA技术知识分享的推送,精选了UWA社区的热门话题,…...
24年电赛——自动行驶小车(H题)基于 CCS Theia -陀螺仪 JY60 代码移植到 MSPM0G3507(附代码)
前言 只要搞懂 M0 的代码结构和 CCS 的图形化配置方法,代码移植就会变的很简单。因为本次电赛的需要,正好陀螺仪部分代码的移植是我完成的。(末尾附全部代码) 一、JY60 陀螺仪 JY60特点 1.模块集成高精度的陀螺仪、加速度计&…...
【Redis】Centos 7 安装 Redis 5.0
目录 Redis重大版本 Redis 2.6 Redis 2.8 Redis 3.0 Redis 3.2 Redis 4.0 Redis 5.0 Redis 6.0 Redis 7.0 安装并启动Redis 安装scl源 安装Redis5.0 启动Redis 停止Redis Redis重大版本 Redis 借鉴了 Linux 操作系统对于版本号的命名规则:版本号第⼆…...
RocketMQ Dashboard安装
RocketMQ Dashboard 是一个基于 Web 的管理工具,用于监控和管理 RocketMQ 集群。它提供了一个用户友好的界面,使管理员能够轻松地查看和操作 RocketMQ 系统中的各种组件和状态。 主要功能包括: 集群管理: 监控和管理 NameServer 和 Broker …...
吴恩达机器学习L1W3L05-逻辑回归的成本函数
目标 在本实验中,你将: 检查执行情况并利用成本函数进行逻辑回归。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import plot_data, sigmoid, dlc plt.style.use(./deeplearning.mplstyle)数据集 X_train …...
css实现文字根据条件渐变
body 选择器 body { padding: 50vh 0; text-align: center; font-size: 6em; } padding: 50vh 0; 设置了body的上下内边距为视口高度的50%,左右内边距为0。text-align: center; 使得body内的文本内容居中显示。font-size: 6em; 设置了字体大小为当前字体尺寸的6倍…...
【hive】HiveSQL中两个json解析函数的使用json路径定位小工具
文章目录 1.HiveSQL中两个json解析函数1)get_json_object2)json_tuple 2.json中key所在层级路径定位小工具 关于json: https://blog.csdn.net/atwdy/article/details/124668815 1.HiveSQL中两个json解析函数 1)get_json_object …...
科普文:微服务之Spring Cloud Alibaba组件熔断过载保护器Sentinel
一、什么是Sentinel Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 官网:Home alibaba/Sentinel Wiki GitHub 2012年,Sentinel诞生于阿里巴巴,其主要目标是流量控制。…...
【中药网络药理学】筛选细胞衰老和预后相关基因(附分类代码和画图代码)
具体代码和详细的中药网络药理学代码以及讲解可以看我的github(欢迎star)doge https://github.com/qianwei1129/TCM-Network-Pharmacology 1、衰老相关基因 从HAGR和msigdb数据获取细胞衰老相关基因,将两者取交集后构建基因蛋白互作网络 …...
科研必备,一些免费好用的文献查阅网站!
分享几个自己常用的文献查询网站,当然如果有好的新站点,我这边也会随缘更新的。 1、包阅学术 作为医学文献查找领域的创新力量,利用先进的人工智能技术,为医学生提供个性化的文献推荐与智能检索服务。 它能够理解用户的学术兴趣与…...