【视觉基础篇】12 # 如何使用滤镜函数实现美颜效果?

说明

【跟月影学可视化】学习笔记。

如何理解像素化?

像素化

所谓像素化,就是把一个图像看成是由一组像素点组合而成的。每个像素点负责描述图像上的一个点,并且带有这个点的基本绘图信息。

像素点是怎么存储的?

Canvas2D 以 4 个通道来存放每个像素点的颜色信息,每个通道是 8 个比特位,也就是 0~255 的十进制数值,4 个通道对应 RGBA 颜色的四个值。

应用一:实现灰度化图片

什么是灰度化?

灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。

灰度化图片:简单来说就是将一张彩色图片变为灰白色图片。

灰度化的原理

实现思路:先将该图片的每个像素点的 R、G、B 通道的值进行加权平均,然后将这个值作为每个像素点新的 R、G、B 通道值,具体公式如下:

在这里插入图片描述

其中 R、G、B 是原图片中的 R、G、B 通道的色值,V 是加权平均色值,a、b、c 是加权系数,满足 (a + b + c) = 1。

用加权平均的计算公式来替换图片的 RGBA 的值。这本质上其实是利用线性方程组改变了图片中每一个像素的 RGB 通道的原色值,将每个通道的色值映射为一个新色值。

在这里插入图片描述

灰度化图片的过程

  1. 加载图片
  2. 绘制图片到canvas
  3. 获取 imageData 信息
  4. 循环处理每个像素的颜色信息
  5. 最后写入canvas

我们先去找一张图片,等下实现灰度化图片例子需要:https://unsplash.com/photos/QRBuN0wNm-8

在这里插入图片描述

我们先了解一下图片的像素信息,图片的全部像素信息会以类型数组Uint8ClampedArray)的形式保存在 ImageData 对象的 data 属性里,而类型数组的每 4 个元素组成一个像素的信息,这四个元素依次表示该像素的 RGBA 四通道的值,所以它的数据结构如下:

data[0] // 第1行第1列的红色通道值
data[1] // 第1行第1列的绿色通道值
data[2] // 第1行第1列的蓝色通道值
data[3] // 第1行第1列的Alpha通道值
data[4] // 第1行第2列的红色通道值
data[5] // 第1行第2列的绿色通道值
...

代码实现:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>灰度化图片</title></head><body><canvas id="paper" width="0" height="0"></canvas><script type="module">import {loadImage,getImageData,traverse,} from "./common/lib/util.js";const canvas = document.getElementById("paper");const context = canvas.getContext("2d");(async function () {// 异步加载图片const img = await loadImage("https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80");// 获取图片的 imageData 数据对象const imageData = getImageData(img);console.log("imageData---->", imageData);// 遍历 imageData 数据对象:traverse 函数会自动遍历图片的每个像素点,把获得的像素信息传给参数中的回调函数处理traverse(imageData, ({ r, g, b, a }) => {// 对每个像素进行灰度化处理const v = 0.2126 * r + 0.7152 * g + 0.0722 * b;return [v, v, v, a];});// 更新canvas内容canvas.width = imageData.width;canvas.height = imageData.height;// 将数据从已有的 ImageData 对象绘制到位图context.putImageData(imageData, 0, 0);})();</script></body>
</html>

抽离的逻辑:/common/lib/util.js

// 异步加载图片
export function loadImage(src) {const img = new Image();img.crossOrigin = "anonymous";return new Promise((resolve) => {img.onload = () => {resolve(img);};img.src = src;});
}const imageDataContext = new WeakMap();
// 获得图片的 imageData 数据
export function getImageData(img, rect = [0, 0, img.width, img.height]) {let context;if (imageDataContext.has(img)) {context = imageDataContext.get(img)} else {// OffscreenCanvas 提供了一个可以脱离屏幕渲染的 canvas 对象。它在窗口环境和web worker环境均有效。const canvas = new OffscreenCanvas(img.width, img.height);context = canvas.getContext("2d");context.drawImage(img, 0, 0);imageDataContext.set(img, context);}console.log("imageDataContext---->", imageDataContext);// CanvasRenderingContext2D.getImageData() 返回一个ImageData对象,用来描述 canvas 区域隐含的像素数据return context.getImageData(...rect);
}// 循环遍历 imageData 数据
export function traverse(imageData, pass) {const { width, height, data } = imageData;// width * height * 4:图片一共是width * height 个像素点,每个像素点有 4 个通道for (let i = 0; i < width * height * 4; i += 4) {// 除以 255 为了做归一化,接受的是0~1的值,方便矩阵运算const [r, g, b, a] = pass({r: data[i] / 255,g: data[i + 1] / 255,b: data[i + 2] / 255,a: data[i + 3] / 255,index: i,width,height,x: ((i / 4) % width) / width,y: Math.floor(i / 4 / width) / height,});data.set([r, g, b, a].map((v) => Math.round(v * 255)),i);}return imageData;
}

在这里插入图片描述

应用二:使用像素矩阵通用地改变像素颜色

创建一个 4*5 颜色矩阵,让它的第一行决定红色通道,第二行决定绿色通道,第三行决定蓝色通道,第四行决定 Alpha 通道。

在这里插入图片描述

如果要改变一个像素的颜色效果,只需要将该矩阵与像素的颜色向量相乘即可。通常把返回颜色矩阵的函数,一般称为颜色滤镜函数

灰度化 grayscale 函数

人的视觉对 R、G、B 三色通道的敏感度是不一样的,对绿色敏感度高,所以加权值高,对蓝色敏感度低,所以加权值低。

// 参数 p,它是一个 0~1 的值,表示灰度化的程度,1 是完全灰度化,0 是完全不灰度(原始色彩)。
function grayscale(p = 1) {const r = 0.2126 * p;const g = 0.7152 * p;const b = 0.0722 * p;return [r + 1 - p, g, b, 0, 0,r, g + 1 - p, b, 0, 0,r, g, b + 1 - p, 0, 0,0, 0, 0, 1, 0,];
}

过滤或增强某个颜色通道 channel 函数

function channel({r = 1, g = 1, b = 1}) {return[r, 0,0, 0, 0,0, g, 0, 0, 0,0, 0, b, 0, 0,0, 0, 0, 1, 0,];
}

亮度(Brightness)函数

// 改变亮度,p = 0 全暗,p > 0 且 p < 1 调暗,p = 1 原色, p > 1 调亮
function brightness(p) {return [p, 0, 0, 0, 0,0, p, 0, 0, 0,0, 0, p, 0, 0,0, 0, 0, 1, 0,];
}

饱和度(Saturate)函数

// 饱和度,与grayscale正好相反 p = 0 完全灰度化,p = 1 原色,p > 1 增强饱和度
function saturate(p) {const r = 0.212 * (1 - p);const g = 0.714 * (1 - p);const b = 0.074 * (1 - p);return [r + p, g, b, 0, 0,r, g + p, b, 0, 0,r, g, b + p, 0, 0,0, 0, 0, 1, 0,];
}

对比度(Constrast)函数

// 对比度, p = 1 原色, p < 1 减弱对比度,p > 1 增强对比度
function contrast(p) {const d = 0.5 * (1 - p);return [p, 0, 0, 0, d,0, p, 0, 0, d,0, 0, p, 0, d,0, 0, 0, 1, 0,];
}

透明度(Opacity)函数

// 透明度,p = 0 全透明,p = 1 原色
function opacity(p) {return [1, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, p, 0,];
}

反色(Invert)函数

// 反色, p = 0 原色, p = 1 完全反色
function invert(p) {const d = 1 - 2 * p;return [d, 0, 0, 0, p,0, d, 0, 0, p,0, 0, d, 0, p,0, 0, 0, 1, 0,];
}

旋转色相(HueRotate)函数

// 色相旋转,将色调沿极坐标转过deg角度
export function hueRotate(deg) {const rotation = deg / 180 * Math.PI;const cos = Math.cos(rotation),sin = Math.sin(rotation),lumR = 0.213,lumG = 0.715,lumB = 0.072;return [lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,0, 0, 0, 1, 0,];
}

实战:让一张图片变得有“阳光感”

我们使用叠加 channel 函数中的红色通道、brightness 函数和 saturate 函数来实现。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>让一张图片变得有阳光感</title></head><body><img src="https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80" alt=""><canvas id="paper" width="0" height="0"></canvas><script type="module">import {loadImage,getImageData,traverse,} from "./common/lib/util.js";import { transformColor, channel, brightness, saturate } from "./common/lib/color-matrix.js";const canvas = document.getElementById("paper");const context = canvas.getContext("2d");(async function () {// 异步加载图片const img = await loadImage("https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80");// 获取图片的 imageData 数据对象const imageData = getImageData(img);console.log("imageData---->", imageData);// 遍历 imageData 数据对象:traverse 函数会自动遍历图片的每个像素点,把获得的像素信息传给参数中的回调函数处理traverse(imageData, ({ r, g, b, a }) => {// 将 color 通过颜色矩阵映射成新的色值返回return transformColor([r, g, b, a],channel({r: 1.2}), // 增强红色通道brightness(1.2), // 增强亮度saturate(1.2), // 增强饱和度 );});// 更新canvas内容canvas.width = imageData.width;canvas.height = imageData.height;// 将数据从已有的 ImageData 对象绘制到位图context.putImageData(imageData, 0, 0);})();</script></body>
</html>

在这里插入图片描述

应用三:使用高斯模糊对照片美颜

可视化里为了突出呈现的内容,通常会使用颜色滤镜来增强视觉呈现的细节,而用一种相对复杂的滤镜来模糊背景,这个复杂滤镜就叫做高斯模糊Gaussian Blur)。高斯模糊是一个非常重要的平滑效果滤镜Blur Filters)。

高斯模糊的原理与颜色滤镜不同,高斯模糊不是单纯根据颜色矩阵计算当前像素点的颜色值,而是会按照高斯分布的权重,对当前像素点及其周围像素点的颜色按照高斯分布的权重加权平均。具体的可以看文章的拓展部分。

二维高斯函数

计算式:

const a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
const b = -1 / (2 * sigma ** 2);const g = a * Math.exp(b * x ** 2);

在这里插入图片描述

高斯分布矩阵

这个矩阵的作用是按照高斯函数提供平滑过程中参与计算的像素点的加权平均权重。

function gaussianMatrix(radius, sigma = radius / 3) {const a = 1 / (Math.sqrt(2 * Math.PI) * sigma);const b = -1 / (2 * sigma ** 2);let sum = 0;const matrix = [];for(let x = -radius; x <= radius; x++) {const g = a * Math.exp(b * x ** 2);matrix.push(g);sum += g;}for(let i = 0, len = matrix.length; i < len; i++) {matrix[i] /= sum;}return {matrix, sum};
}

高斯模糊函数

/*** 高斯模糊* @param  {Array} pixes  pix array* @param  {Number} width 图片的宽度* @param  {Number} height 图片的高度* @param  {Number} radius 取样区域半径, 正数, 可选, 默认为 3.0* @param  {Number} sigma 标准方差, 可选, 默认取值为 radius / 3* @return {Array}*/
export function gaussianBlur(pixels, width, height, radius = 3, sigma = radius / 3) {const { matrix, sum } = gaussianMatrix(radius, sigma);// x 方向一维高斯运算for (let y = 0; y < height; y++) {for (let x = 0; x < width; x++) {let r = 0,g = 0,b = 0;for (let j = -radius; j <= radius; j++) {const k = x + j;if (k >= 0 && k < width) {const i = (y * width + k) * 4;r += pixels[i] * matrix[j + radius];g += pixels[i + 1] * matrix[j + radius];b += pixels[i + 2] * matrix[j + radius];}}const i = (y * width + x) * 4;// 除以 sum 是为了消除处于边缘的像素, 高斯运算不足的问题pixels[i] = r / sum;pixels[i + 1] = g / sum;pixels[i + 2] = b / sum;}}// y 方向一维高斯运算for (let x = 0; x < width; x++) {for (let y = 0; y < height; y++) {let r = 0,g = 0,b = 0;for (let j = -radius; j <= radius; j++) {const k = y + j;if (k >= 0 && k < height) {const i = (k * width + x) * 4;r += pixels[i] * matrix[j + radius];g += pixels[i + 1] * matrix[j + radius];b += pixels[i + 2] * matrix[j + radius];}}const i = (y * width + x) * 4;pixels[i] = r / sum;pixels[i + 1] = g / sum;pixels[i + 2] = b / sum;}}return pixels;
}

例子:使用高斯模糊函数处理图片

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>高斯模糊</title></head><body><imgsrc="https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80"alt=""/><canvas id="paper" width="0" height="0"></canvas><script type="module">import {loadImage,getImageData,gaussianBlur,} from "./common/lib/util.js";const canvas = document.getElementById("paper");const context = canvas.getContext("2d");(async function () {// 异步加载图片const img = await loadImage("https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80");// 获取图片的 imageData 数据对象const imageData = getImageData(img);const { width, height, data } = imageData;// 对imageData应用高斯模糊:整体对图片所有像素应用高斯模糊函数。gaussianBlur(data, width, height, 30, 10);// 更新canvas内容canvas.width = imageData.width;canvas.height = imageData.height;// 将数据从已有的 ImageData 对象绘制到位图context.putImageData(imageData, 0, 0);})();</script></body>
</html>

可以明显的右边是用了高斯模糊的

在这里插入图片描述

像素化与 CSS 滤镜

如果只是按照某些特定规则改变一个图像上的所有像素,浏览器提供了更简便的方法:CSS滤镜。

  • CSS 滤镜
  • Canvas 滤镜
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS滤镜</title>
</head>
<body><img src="https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80"><img src="https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80"style="filter:grayscale(100%)"><img src="https://images.unsplash.com/photo-1666552982368-dd0e2bb96993?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80"style="filter:blur(1.5px) grayscale(0.5) saturate(1.2) contrast(1.1) brightness(1.2)">
</body>
</html>

在这里插入图片描述

相比起来CSS 滤镜和 Canvas 滤镜都很好用,但只能实现比较固定的视觉效果。而用像素处理图片更灵活,因为它可以实现滤镜功能,还可以实现更加丰富的效果,包括一些非常炫酷的视觉效果。

拓展:高斯模糊的算法

下面这些来自阮一峰的网络日志:高斯模糊的算法

通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。

模糊的算法有很多种,其中有一种叫做高斯模糊Gaussian Blur)。它将正态分布(又名高斯分布)用于图像处理。

本质上,它是一种数据平滑技术(data smoothing),适用于多个场合,图像处理恰好提供了一个直观的应用实例。

一、高斯模糊的原理

所谓模糊,可以理解成每一个像素都取周边像素的平均值。在图形上,就相当于产生"模糊"效果,"中间点"失去细节。计算平均值时,取值范围越大,"模糊效果"越强烈。

每个点都要取周边像素的平均值,那么应该如何分配权重呢?

二、正态分布的权重

正态分布显然是一种可取的权重分配模式。

在这里插入图片描述

在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。

计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

三、高斯函数

上面的正态分布是一维的,图像都是二维的,所以我们需要二维的正态分布。

在这里插入图片描述
正态分布的密度函数叫做高斯函数(Gaussian function)。它的一维形式是:
在这里插入图片描述

其中,μ是x的均值,σ是x的方差。因为计算平均值的时候,中心点就是原点,所以μ等于0。
在这里插入图片描述

根据一维高斯函数,可以推导得到二维高斯函数:

在这里插入图片描述

有了这个函数 ,就可以计算每个点的权重了。

四、权重矩阵

假定中心点的坐标是(0,0),那么距离它最近的8个点的坐标如下:

在这里插入图片描述
为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:

在这里插入图片描述

这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。

在这里插入图片描述

五、计算高斯模糊

有了权重矩阵,就可以计算高斯模糊的值了。

假设现有9个像素点,灰度值(0-255)如下:

在这里插入图片描述

每个点乘以自己的权重值:

在这里插入图片描述
得到

在这里插入图片描述
将这9个值加起来,就是中心点的高斯模糊的值。

对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

六、边界点的处理

如果一个点处于边界,周边没有足够的点,怎么办?

一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。

参考资料

  • 高斯模糊的算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64084.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ / Opencv 简单实现美颜效果(瘦脸、大眼、磨皮等)

最近项目需要用到美颜的一些效果&#xff0c;因此开始接触opencv 计算机视觉库,在腾讯课堂上找到一个简单且免费的入门视频《Opencv4 快速入门视频30讲》&#xff0c;看完视频后&#xff0c;初步才对opencv 有一个比较清晰的概念和基本用法。 接下来就是开始对美颜的一些初步接…

Ps人像磨皮皮肤美白插件哪个好_安装教程

今天这个PS插件挺好用的&#xff0c;我们可以用它快速给人像照片磨皮、皮肤美白、上妆等功能&#xff0c;还是非常方便我们后期修图的&#xff0c;有需要这个插件的可以至陌鱼社区瞧一下。插件支持:Adobe PhotoshopCC2015 - CC2018,这里我们用Adobe PhotoshopCC2018做为演示&am…

对皮肤美白算法的一些研究

本篇博文来自博主Imageshop&#xff0c;打赏或想要查阅更多内容可以移步至Imageshop。 转载自&#xff1a;https://www.cnblogs.com/Imageshop/p/3843635.html 侵删 皮肤美白是现在任何一款流行的美颜软件必备的功能之一&#xff0c;不过你如果在互联网上搜索关于美白算法&a…

Portraiture4.0最新PS专属修图磨皮美白插件

作为PS的插件&#xff0c;被众多照片后期高手使用&#xff0c;评价颇高。主要原因在于它操作简便、磨皮效果好、软件很小&#xff0c;特别是它可以自动感应皮肤区域磨皮&#xff0c;只对皮肤作用更令人称奇的是&#xff1a;Portraiture 磨皮能保留下细小的毛孔和皮肤质感&#…

photoshop ps 美白 去污 磨皮 方法

目录 1.美白 2.去污 3.磨皮 1.美白 使用PS打开照片&#xff0c;然后复制一个图层。 复制的快捷方式就是 CTRLJ 复制的图层&#xff0c;把混合模式选择在“滤色”&#xff0c;然后调整旁边的透明度。 这个过程其实是把照片调亮。 完成之后&#xff0c;合并图层。合并图层的…

图像滤镜艺术---人脸编辑(五官微调+瘦脸美型)

写本文的目的&#xff0c;实际上是对目前人脸美型这一块技术做个总结&#xff0c;跟大家 分享一下&#xff01; 目前提到美颜算法&#xff0c;大家都会想到磨皮美白 /大眼瘦脸&#xff0c;实际上做好 美颜这件事情&#xff0c;关乎的不仅仅是这些&#xff0c;还有五官的协调比…

ps美白磨皮处理第三方插件portraiture

ps的功能这么强大&#xff0c;其美白磨皮方法当然不止一种。本文就给大家细数一下ps美白磨皮常用的几种方法。在各种方法中&#xff0c;插件法的操作更为简单&#xff0c;效果也更好&#xff0c;因此我们还会介绍ps磨皮美白插件哪个好。事不宜迟&#xff0c;一起来看看吧。 一…

初中英语知识水平测试软件,初中英语学科知识与能力模拟测试一

一、单项选择题(本大题共30小题,每小题2分,共60分) 在每小题列出的四个备选项中选择一个最佳答案,错选、多选或未选均无分。 *1. Which of the following doesnt contain liaison&#xff1f; A. Put it on, please B. Not at all C. Please pick it up D. Great minds…

轻松完成公司数据分析、业务数据探查的秘诀

2022年即将结束&#xff0c;您企业经营目标达成情况如何&#xff1f;是否可以快速对企业进行数据体检分析&#xff1f;天通眼带您快速了解企业各个维度的经营状况。 PART 01 年度计划检视 2022年还剩余1个月&#xff0c;您企业年度目标达成情况如何&#xff1f;每个月、每个季度…

数据分析真的很火吗?真的有很多企业需要这样的岗位吗?求大佬指点。

“我是去年毕业的&#xff0c;因为疫情影响&#xff0c;整个就业环境都很不好&#xff0c;很多企业都裁员了。加上疫情三年基本都是玩过去&#xff0c;也没啥一技之长&#xff0c;就业就更难了。听说现在做数据分析的人很多&#xff0c;我身边的朋友都在转行做数据分析。 其实…

数据分析师应该了解的数据湖

数据湖 数据湖是一个集中式存储库&#xff0c;允许您以任意规模存储所有结构化和非结构化数据。您可以按原样存储数据&#xff08;无需先对数据进行结构化处理&#xff09;&#xff0c;并运行不同类型的分析 – 从控制面板和可视化到大数据处理、实时分析和机器学习&#xff0c…

数据分析师获取数据的方式有哪些?

1、外部购买数据 有很多公司或者平台是专门做数据收集和分析的&#xff0c;企业会直接从那里购买数据或者相关服务给数据分析师&#xff0c;这是一种常见的获取数据的方式之一。 2、网络爬取数据 除了购买数据以外&#xff0c;数据分析师还可以通过网络爬虫从网络上爬取数据…

计算机网络b站里谁讲得好,除了罗翔,B站还有多少神仙老师?

本文由【哔哩哔哩】授权转载, 【作者:小尹 编辑:会厌】 【图片来自网络,若侵则删】 如果苏格拉底和孔子生活在这个时代,他们会不会上B站,并成为一名UP主呢? 提出这个问题的,是B站UP主、中国政法大学教授罗翔老师。罗翔的粉丝超过千万,是B站最受欢迎的老师之一。 此外,…

受害者有罪论——如何反驳

目录 一、那些「受害者有罪论」的说法 二、「受害者有罪论」的潜台词 三、如何反驳 反驳1&#xff1a;让受害者有罪论者感同身受 反驳2&#xff1a;说理 反驳3&#xff1a; 直接指出结论的错误 反驳4&#xff1a;与对方无关&#xff0c;不用多费唇舌 四、罪犯就是罪犯&…

李永乐老师讲一个量子计算机,别再只知道罗翔了!网上最受欢迎的14位老师,个个让人“开天眼”!...

除了推荐「学什么」&#xff0c;这次&#xff0c;我还要推荐「跟谁学」。 第一反应&#xff0c;是跟着大学老师学习&#xff01; 虽然我是北大清华得不到的人&#xff0c;但是听听高校老师讲课&#xff0c;还是 ok 的。 这里借用一位网友的话&#xff1a; 经过在网络上长时间的…

罗翔老师的书单

编者按&#xff1a; 作为中国政法大学法学教授、B 站坐拥百万粉丝的法考讲师罗翔&#xff0c;在近期的一次访谈中提及他在天桥上帮助一位老人的故事&#xff0c;而这个故事也曾收入他2019年出版的随笔《圆圈正义》。除了讲授法律知识&#xff0c;罗翔也是读书路上一位可靠的引路…

九龙证券|突发黑天鹅,股价两日跌停,这只更名股或将被ST!

今年以来&#xff0c;上市公司定增募资额翻倍增加&#xff0c;北上资金出手加仓多只个股。 今天盘面上&#xff0c;以创新药为首的医药医疗板块全线爆发&#xff0c;首药控股20cm涨停&#xff0c;奥赛康、海思科封板。房地产板块迎来久别反弹&#xff0c;并带动家居家电股走高&…

零点有数董事长袁岳:算法产业化应更多聚焦中模型发展

文章来源&#xff1a;【零点有数科技】 【编者按】 袁岳&#xff0c;零点有数董事长&#xff0c;黑苹果青年公益理事长&#xff0c;飞马旅联合创始人&#xff0c;独立媒体人&#xff0c;发表关于数据科学、管理科学、社会群体研究等相关领域著作逾一千三百五十万字。2021年&am…

陕西省赛2023-部分Reverse复现

目录 我的upx -d怎么坏了 动调脱upx壳&#xff1a; babypython BadCoffee ob混淆&#xff1a; 我的upx -d怎么坏了 打开附件&#xff0c;发现是upx壳&#xff0c;应该是修改了区段名或者特征码 但是修改过还是不对.....(哭.jpg)应该还是改了其他 好学长告诉我直接动态调试…