当前位置: 首页 > news >正文

17.3.4 颜色矩阵

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
17.3.4.1 矩阵基本概念

矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,类似于数组。

由于在图像处理时使用到矩阵的乘法,这里只谈谈矩阵的乘法运算。

矩阵乘法运算公式:

图17-56 矩阵乘法运算公式

在C#中,矩阵使用了颜色的四个分量:红色分量R、绿色分量G、蓝色分量B、透明度A。但光是依靠上述4个分量,不足以完全实现矩阵变换,所以再加上一个用来进行颜色增减的分量W,而W始终等于255。

假设变换前的5个颜色分量为R、G、B、A、W;

变换后的5个颜色分量为R’、G’、B’、A’、W’,

乘以一个5×5的矩阵,得到公式如下:

图17-57 颜色矩阵乘法公式

R’、G’、B’、A’、W’对应的值分别为:

R'= R*r1+G*g1+B*b1+A*a1+W*w1

G’= R*r2+G*g2+B*b2+A*a2+W*w2

B’= R*r3+G*g3+B*b3+A*a3+W*w3

A’= R*r4+G*g4+B*b4+A*a4+W*w4

W’= R*r5+G*g5+B*b5+A*a5+W*w5

在这个公式基础上,先来看几组比较常见的变换:

1、变换后颜色相同:

图17-58 矩阵变换:相同矩阵

具体计算过程:

R'= R*1+G*0+B*0+A*0+W*0 =R

G’= R*0+G*1+B*0+A*0+W*0 =G

B’= R*0+G*0+B*1+A*0+W*0 =B

A’=  R*0+G*0+B*0+A*1+W*0 =A

W’= R*0+G*0+B*0+A*0+W*1 =W

2、仅保留红色分量:

图17-59 矩阵变换:保留红色分量

3、仅保留绿色分量:

图17-60 矩阵变换:保留绿色分量

4、仅保留蓝色分量:

图17-61 矩阵变换:保留蓝色分量

5、灰度变换:平均值法,参看第17.3.1.3节:

图17-62 矩阵变换:灰度平均值

R'= R*0.33+G*0.33+B*0.33+A*0+W*0

G’=R*0.33+G*0.33+B*0.33+A*0+W*0

B’= R*0.33+G*0.33+B*0.33+A*0+W*0

A’=  A

W’= 0

6、灰度变换:指数加权法,参看第17.3.1.3节:

图17-63 矩阵变换:灰度指数加权

R'= R*0.30+G*0.59+B*0.11

G’=R*0.30+G*0.59+B*0.11

B’= R*0.30+G*0.59+B*0.11

A’=  A

W’= 0

7、逆反,参看第17.3.1.1节:

图17-64 矩阵变换:逆反

R'= R*-1+G*0+B*0+A*0+W*0  =-R

G’=R*0+G*-1+B*0+A*0+W*0=-G

B’= R*0+G*0+B*-1+A*0+W*0  =-B

A’=  R*0+G*0+B*0+A*1+W*0  =A

W’= R*0+G*0+B*0+A*0+W*0  = 0

在理想化的情况下,以红色分量为例:如果R=10,R逆反后为-R,即-10。由于R是Byte(范围是0-255),因此R=255-10=245。但是,实际情况下,C#可以那样运算,VB.Net不行,-10由于小于0,直接被转成了0;同样其它两个分量G、B,由于是负数,都直接成了0。使用上面逆反矩阵的话,得到的图像永远是一片白色的。

下面才是正确的逆反矩阵:

图17-65 矩阵变换:逆反修正

R'= R*-1+G*0+B*0+A*0+W*1  =255-R

G’=R*0+G*-1+B*0+A*0+W*1=255-G

B’= R*0+G*0+B*-1+A*0+W*1 =255-B

A’=  R*0+G*0+B*0+A*1+W*0  =A

W’= R*0+G*0+B*0+A*0+W*0  = 0

下一节我们将实战使用以上的矩阵公式。

17.3.4.2 ColorMatrix类

ColorMatrix(颜色矩阵)类是一个包含 RGBAW 空间坐标的 5 x 5 矩阵。ImageAttributes类的SetColorMatrix和SetColorMatrices方法通过使用ColorMatrix调整图像颜色。

ColorMatrix常用属性:

Item:ColorMatrix中位于指定的行和列的元素。

Matrix00:Single,单精度浮点数。 ColorMatrix 第 0行第 0 列的元素 (注意,同数组,矩阵行列的起始从0开始)。

Matrix01:Single,单精度浮点数。ColorMatrix 第 0行第 1 列的元素。

……

Matrix44:Single,单精度浮点数。ColorMatrix 第 4行第4 列的元素。

Matrix00-Matrix44的位置如下图:

图17-66 ColorMatrix元素位置

ColorMatrix的构造函数包括两个版本的重载:

1、public ColorMatrix()

2、public ColorMatrix( float[][] newColorMatrix )

第一种方法是声明一个ColorMatrix实例,然后使对它的属性Matrix00-Matrix44赋值。

常用的是第二种,定义并初始化一个二位数组,然后用构造函数 ColorMatrix(Single()()) 直接初始化一个Matrix,例如以下代码:

    float[][] imgMatrixElement= {

    new float[] {1, 0, 0, 0, 0},

    new float[] {0, 0, 0, 0, 0},

    new float[] {0, 0, 0, 0, 0},

    new float[] {0, 0, 0, 1, 0},

    new float[] {0, 0, 0, 0, 0}

    }

    Dim imgMatrix As New ColorMatrix(imgMatrixElement)

当实例化一个ColorMatrix后并给它的各个元素赋值后,就可以使用imageAttributes的SetColorMatrix方法,为图像设置颜色矩阵,例如:

imageAttributes.SetColorMatrix(imgMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

上述代码使用的是SetColorMatrix方法的以下重载版本:

public void SetColorMatrix( ColorMatrix newColorMatrix, ColorMatrixFlag mode, ColorAdjustType type )

参数说明:

  1. newColorMatrix:要进行颜色调整的矩阵。
  2. grayMatrix:这是一个ColorMatrixFlag 枚举,包含以下成员:
  1. AltGrays:仅调整灰色底纹。
  2. Default:指定所有的颜色值(包括灰色底纹)都由同样的颜色调整矩阵来调整。
  3. SkipGrays:指定调整所有颜色,但不调整灰色底纹。 灰色底纹是指其红色、绿色和蓝色分量的值都相同的任何颜色。

    通常情况下使用的是 ColorMatrixFlag.Default。

  1. 参数flags:这是一个ColorAdjustType枚举,包含以下成员:
  1. Any:指定的类型的数目。
  2. Bitmap:Bitmap 对象的颜色调整信息。
  3. Brush:Brush 对象的颜色调整信息。
  4. Count:指定的类型的数目。
  5. Default:自身没有颜色调整信息的所有 GDI+ 对象所使用的颜色调整信息。
  6. Pen:Pen 对象的颜色调整信息。
  7. Text:文本的颜色调整信息。

通常情况对图像的颜色进行调整,使用ColorAdjustType.Bitmap。

【例 17.57【项目:code17-035】使用矩阵灰度化图像。

本例中使用了第17.3.4.1节中灰度变换平均值法的矩阵。

窗体级变量、窗体载入、载入图片的代码请参看第17.3.1节【项目:code17-031】。

主要代码如下:

       private void btnGray_Click(object sender, EventArgs e)

        {

            ImageAttributes imageAttributes = new ImageAttributes();

            DateTime timeStart, timeEnd;

            TimeSpan timeDiff;

            timeStart = DateTime.Now;

            //灰度平均值法

            float [][] imgMatrixElement = {

                  new float [] { 0.33f, 0.33f, 0.33f, 0, 0},

                  new float [] { 0.33f, 0.33f, 0.33f, 0, 0},

                  new float [] { 0.33f, 0.33f, 0.33f, 0, 0},

                  new float [] { 0, 0, 0, 1, 0},

                  new float [] { 0, 0, 0, 0, 0}

            };

            ColorMatrix imgMatrix = new ColorMatrix(imgMatrixElement);

            imageAttributes.SetColorMatrix(imgMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

            Bitmap destImg = new Bitmap(sourceImg.Width, sourceImg.Height);

            Graphics g = Graphics.FromImage(destImg);

            g.DrawImage(sourceImg, new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), 0, 0, sourceImg.Width, sourceImg.Height,

                        GraphicsUnit.Pixel, imageAttributes);

            picDest.Image = destImg;

            timeEnd = DateTime.Now;

            timeDiff = timeEnd - timeStart;

            lblByMatrix.Text = timeDiff.TotalMilliseconds + "ms";

        }

运行结果如下图所示:

图17-67 使用矩阵灰度化图像

从图17-57可以看到,使用矩阵处理图像所耗费的时间约为340.12ms,处理速度间于像素处理与内存处理,使用矩阵的代码比使用内存的代码更简洁,但是像素处理和内存处理更为灵活,应该根据实际需要选择图像处理方式。

【例 17.58【项目:code17-036】矩阵综合运用。

窗体上放置25个TextBox,名称从“txt00”到“txt44”,分别对应矩阵属性Matrix00至Matrix44。放置1个ComboBox,用于设置常见的矩阵值。

主要代码如下:

        Bitmap sourceImg;

        private void Form1_Load(object sender, EventArgs e)

        {

            picSource.SizeMode = PictureBoxSizeMode.StretchImage;

            picDest.SizeMode = PictureBoxSizeMode.StretchImage;

            cbMatrixType.DropDownStyle = ComboBoxStyle.DropDownList;

            cbMatrixType.Items.Add("全部重置");

            cbMatrixType.Items.Add("保留红色分量");

            cbMatrixType.Items.Add("保留绿色分量");

            cbMatrixType.Items.Add("保留蓝色分量");

            cbMatrixType.Items.Add("灰度平均值");

            cbMatrixType.Items.Add("灰度指数加权");

            cbMatrixType.Items.Add("逆反");

            cbMatrixType.Text = cbMatrixType.Items[0].ToString();

        }

        private void btnLoad_Click(object sender, EventArgs e)

        {

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "图片文件|*.jpg;*.png";

            if (ofd.ShowDialog() != DialogResult.OK)

                return;

            sourceImg = (Bitmap)Image.FromFile(ofd.FileName);

            picSource.Image = sourceImg;

        }

        private void btnDraw_Click(object sender, EventArgs e)

        {

            ImageAttributes imageAttributes =new ImageAttributes();

            ColorMatrix imgMatrix =new ColorMatrix();

            TextBox txtControl;

            for (int i = 0; i < 5; i++)

            {

                for (int j = 0; j < 5; j++)

                {

                    txtControl = (TextBox)(this.Controls["txt" + i + j]);

                    //矩阵相当于是二维数组

                    imgMatrix[i, j] = Single.Parse(txtControl.Text);

                }

            }

            imageAttributes.SetColorMatrix(imgMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

            Bitmap destImg =new Bitmap(sourceImg.Width, sourceImg.Height);

            Graphics g = Graphics.FromImage(destImg);

            g.DrawImage(sourceImg, new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), 0, 0, sourceImg.Width, sourceImg.Height,

                        GraphicsUnit.Pixel, imageAttributes);

            picDest.Image = destImg;

        }

        private void cbMatrixType_SelectedIndexChanged(object sender, EventArgs e)

        {

            setMatrixType();

        }

        private void setMatrixType()

        {

            //重置矩阵的值

            resetText();

            switch(cbMatrixType.Text)

            {

                case "全部重置":

                    //不处理

                    break;

                case "保留红色分量":

                    txt00.Text = "1";

                    txt33.Text = "1";

                    break;

                case "保留绿色分量":

                    txt11.Text = "1";

                    txt33.Text = "1";

                    break;

                case "保留蓝色分量":

                    txt22.Text = "1";

                    txt33.Text = "1";

                    break;

                case "灰度平均值":

                    txt00.Text = "0.33";

                    txt01.Text = "0.33";

                    txt02.Text = "0.33";

                    txt10.Text = "0.33";

                    txt11.Text = "0.33";

                    txt12.Text = "0.33";

                    txt20.Text = "0.33";

                    txt21.Text = "0.33";

                    txt22.Text = "0.33";

                    txt33.Text = "1";

                    break;

                case "灰度指数加权":

                    txt00.Text = "0.30";

                    txt01.Text = "0.30";

                    txt02.Text = "0.30";

                    txt10.Text = "0.59";

                    txt11.Text = "0.59";

                    txt12.Text = "0.59";

                    txt20.Text = "0.11";

                    txt21.Text = "0.11";

                    txt22.Text = "0.11";

                    txt33.Text = "1";

                    break;

                case "逆反":

                    txt00.Text = "-1";

                    txt11.Text = "-1";

                    txt22.Text = "-1";

                    txt40.Text = "1";

                    txt41.Text = "1";

                    txt42.Text = "1";

                    txt33.Text = "1";

                    break;

                default:

                    break;

            }

        }

        //将矩阵关联的文本框全部重置为0

         private void resetText()

        {

            TextBox txtControl;

            for( int i = 0;i<5;i++)

            {

                for(int j = 0;j< 5;j++)

                {

                    //强制类型转换为相应名称的控件

                    txtControl = (TextBox)(this.Controls["txt" + i + j]);

                    txtControl.Text = "0";

                }

            }

        }

运行结果如下图所示:

图17-68 使用矩阵处理图像

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

相关文章:

17.3.4 颜色矩阵

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 17.3.4.1 矩阵基本概念 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;类似于数组。 由…...

1. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--前言

在我们的专栏《单体开发》中&#xff0c;我们实现了一个简单的记账软件的服务端&#xff0c;并且成功上线。随着用户数量的不断增长&#xff0c;问题逐渐开始显现。访问量逐渐增加&#xff0c;服务端的压力也随之加大。随着访问量的攀升&#xff0c;服务端的响应时间变得越来越…...

02.04 数据类型

请写出以下几个数据的类型&#xff1a; 整数 a ----->int a的地址 ----->int* 存放a的数组b ----->int[] 存放a的地址的数组c ----->int*[] b的地址 ----->int* c的地址 ----->int** 指向printf函数的指针d ----->int (*)(const char*, ...) …...

WPS动画:使图形平移、围绕某个顶点旋转一定角度

1、平移 案例三角形如下图&#xff0c;需求&#xff1a;该三角形的A点平移至原点 &#xff08;1&#xff09;在预想动画结束的位置绘制出图形 &#xff08;2&#xff09;点击选中原始图像&#xff0c;插入/动画/绘制自定义路径/直线 &#xff08;3&#xff09;十字星绘制的直线…...

想表示消息返回值为Customer集合

道奈特(240***10) 14:34:55 EA中序列图。我想表示消息返回值为 Customer 集合。目前只有一个Customer实体类&#xff0c;我需要另外新建一个CustomerList 类吗&#xff1f; 潘加宇(35***47) 17:01:26 不需要。如果是分析&#xff0c;在类的操作中&#xff0c;定义一个参数&…...

93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb

进入靶场 页面一直在刷新 在 PHP 中&#xff0c;date() 函数是一个非常常用的处理日期和时间的函数&#xff0c;所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…...

五、定时器实现呼吸灯

5.1 定时器与计数器简介 定时器是一种通过对内部时钟脉冲计数来测量时间间隔的模块。它的核心是一个递增或递减的寄存器&#xff08;计数器值&#xff09;。如果系统时钟为 1 MHz&#xff0c;定时器每 1 μs 计数一次。 计数器是一种对外部事件&#xff08;如脉冲信号&#xff…...

顺序打印数字的进一步理解

之前博客写了篇博文&#xff0c;面试时要求使用多线程顺序打印ABC循环20次&#xff0c;这是我当时使用join函数实现代码&#xff1a; public class TestABCJoin {public static void main(String[] args) {// 创建任务Runnable taskA () -> {for (int i 0; i < 5; i) …...

使用React和Material-UI构建TODO应用的前端UI

使用React和Material-UI构建TODO应用的前端UI 引言环境准备代码解析1. 导入必要的模块2. 创建React组件3. 定义函数3.1 获取TODO列表3.2 创建TODO项3.3 更新TODO项3.4 删除TODO项3.5 处理编辑点击事件3.6 关闭编辑对话框3.7 保存编辑内容 4. 使用Effect钩子5. 渲染组件 功能实现…...

开屏广告-跳过神器

给大家介绍一款超实用的软件——SKIP&#xff0c;它堪称李跳跳的最佳平替&#xff01;这款软件已经在Github开源免费&#xff0c;完全无需担心内置源问题&#xff0c;也无需导入任何规则。安装完成后&#xff0c;即可直接使用&#xff0c;非常便捷&#xff01; 首次打开软件时…...

bat脚本实现自动化漏洞挖掘

bat脚本 BAT脚本是一种批处理文件&#xff0c;可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务&#xff0c;如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…...

如何运行Composer安装PHP包 安装JWT库

1. 使用Composer Composer是PHP的依赖管理工具&#xff0c;它允许你轻松地安装和管理PHP包。对于JWT&#xff0c;你可以使用firebase/php-jwt这个库&#xff0c;这是由Firebase提供的官方库。 安装Composer&#xff08;如果你还没有安装的话&#xff09;&#xff1a; 访问Co…...

(回溯递归dfs 电话号码的字母组合 remake)leetcode 17

只找边界条件和非边界条件&#xff0c;剩下的交给数学归纳法就行&#xff0c;考虑子问题的重复性 [class Solution {vector<string>str { "","","abc","def","ghi","jkl","mno","pqrs"…...

it基础使用--5---git远程仓库

文章目录 it基础使用--5---git远程仓库1. 按顺序看2. 什么是远程仓库3. Gitee操作3.1 新建远程仓库3.2 远程操作基础命令3.3 查看当前所有远程地址别名 git remote -v3.4 创建远程仓库别名 git remote add 别名 远程地址3.4 推送本地分支到远程仓库 git push 别名 分支3.5 拉取…...

Git 的起源与发展

序章&#xff1a;版本控制的前世今生 在软件开发的漫长旅程中&#xff0c;版本控制犹如一位忠诚的伙伴&#xff0c;始终陪伴着开发者们。它的存在&#xff0c;解决了软件开发过程中代码管理的诸多难题&#xff0c;让团队协作更加高效&#xff0c;代码的演进更加有序。 简单来…...

c++提取矩形区域图像的梯度并拟合直线

c提取旋转矩形区域的边缘最强梯度点&#xff0c;并拟合直线 #include <opencv2/opencv.hpp> #include <iostream> #include <vector>using namespace cv; using namespace std;int main() {// 加载图像Mat img imread("image.jpg", IMREAD_GRAYS…...

【PyQt】超级超级笨的pyqt计算器案例

计算器 1.QT Designer设计外观 1.pushButton2.textEdit3.groupBox4.布局设计 2.加载ui文件 导入模块&#xff1a; sys&#xff1a;用于处理命令行参数。 QApplication&#xff1a;PyQt5 应用程序类。 QWidget&#xff1a;窗口基类。 uic&#xff1a;用于加载 .ui 文件。…...

每日一题——小根堆实现堆排序算法

小根堆实现堆排序算法 堆排序的基本思想堆排序的步骤 实现步骤1. 构建小根堆2. 删除最小元素并调整堆 C语言实现输出示例代码解释1. percolateDown 函数2. buildMinHeap 函数3. heapSort 函数4. printArray函数 排序过程详解步骤1&#xff1a;构建小根堆步骤2&#xff1a;删除堆…...

k8s集群

文章目录 项目描述项目环境系统与软件版本概览项目步骤 环境准备IP地址规划关闭selinux和firewall配置静态ip地址修改主机名添加hosts解析 项目步骤一、使用kubeadm安装k8s单master的集群环境&#xff08;1个master2个node节点&#xff09;1、互相之间建立免密通道2.关闭交换分…...

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done....

技术架构师成长路线(2025版)

目录 通用知识 计算机原理&#xff08;1 - 2 个月&#xff09; 数据结构&#xff08;2 - 3 个月&#xff09; 网络编程&#xff08;1 - 2 个月&#xff09; 软件工程&#xff08;1 个月&#xff09; 基础知识 Java 编程语言基础&#xff08;2 - 3 个月&#xff09; JVM&…...

NetLify账号无法登录解决办法

本文收录在【建站】专栏内&#xff0c;专栏目录&#xff1a;【建站】专栏目录 用github账号登录时&#xff0c;说校验失败 Authentication Error Authenticating failed due to the following error: Your account requires additional verification. Please check your email…...

linux本地部署deepseek-R1模型

国产开源大模型追平甚至超越了CloseAI的o1模型&#xff0c;大国崛起时刻&#xff01;&#xff01;&#xff01; DeepSeek R1 本地部署指南   在人工智能技术飞速发展的今天&#xff0c;本地部署AI模型成为越来越多开发者和企业关注的焦点。本文将详细介绍如何在本地部署DeepS…...

集合通讯概览

集合通信概览 &#xff08;1&#xff09;通信的算法 是根据通讯的链路组成的 &#xff08;2&#xff09;因为通信链路 跟硬件强相关&#xff0c;所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练&#xff1a;多维并行&#xff08;xxx并行在上一期已经讲述…...

如何解决云台重力补偿?

如何解决云台重力补偿? 最近在调试步兵云台的时候,由于枪管、图传、摄像头等重力的原因,pitch轴的参数尤其难以调整,又不想抬升和降低使用两套不同的参数,所以使用了重力补偿,效果也是比较理想的,于是整理为一篇文章记录一下 一、问题根源:枪管重力在“搞事情” 想象…...

【LeetCode 刷题】回溯算法(4)-排列问题

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为回溯算法排列问题相关的题目解析。 文章目录 46.全排列47.全排列 II 46.全排列 题目链接 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:res, path [], []used [0] * len(n…...

FPGA|IP核PLL调用测试:建立工程

闲来无事&#xff0c;测试下FPGA的IP核调用 一、生成工程 1、打开软件新建工程 2、命名为PLL_test 3、选择芯片型号 4、生成工程如图...

数据的表示和运算

一-定点数的表示 1-定点数和浮点数 定点数&#xff1a;小数点的位置固定&#xff08;常规计数&#xff09; 浮点数&#xff1a;小数点的位置不固定&#xff08;科学计数法&#xff09; 2-定点数的表示 ①无符号数 整个机器字长的全部二进制位均为数值位&#xff0c;没有符号…...

文字显示省略号

多行文本溢出显示省略号...

22.Word:小张-经费联审核结算单❗【16】

目录 NO1.2 NO3.4​ NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件&#xff0c;而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右&#xff1a;页边距→页码范围&#xff1a;多页&#xff1a;拼页光标处于→布局→分隔符&#xff1a;分节符…...

鲸鱼算法 matlab pso

算法原理 鲸鱼优化算法的核心思想是通过模拟座头鲸的捕食过程来进行搜索和优化。座头鲸在捕猎时会围绕猎物游动并产生气泡网&#xff0c;迫使猎物聚集。这一行为被用来设计搜索策略&#xff0c;使算法能够有效地找到全局最优解。 算法步骤 ‌初始化‌&#xff1a;随机生成一…...

c++之模板进阶

在前面的文章中&#xff0c;我们已经简单的了解了模板的使用&#xff0c;在这篇文章中&#xff0c;我们将继续深入探讨模板 1.模板的特化 1.1 概念 通常情况下&#xff0c;使用模板可以实现一些与类型无关的代码&#xff0c;但对于一些特殊类型的可能会得到一些错误的结果&a…...

C语言中的信号量

信号是操作系统中用来传递特定消息的机制。操作系统可以使用这种方式将程序运行过程中发生的各类特殊情况发送给程序&#xff0c;并按照其指定的逻辑进行处理。信号名称都以 “SIG” 作为前缀&#xff0c;如程序访问非法内存时&#xff0c;会产生名为 SIGSEGV 的信号。 程序需…...

AI主流大模型介绍和API价格比较

主流的大模型系列 ###1. OpenAI: GPT-4&#xff0c;GPT-4 Turbo&#xff0c; GPT-4o OpenAI 的介绍&#xff1a; 全称&#xff1a;Open Artificial Intelligence&#xff0c;简称OpenAI。性质&#xff1a;起初为非营利性组织&#xff0c;后转变为由营利性公司OpenAI LP及非营…...

自主Shell命令行解释器

什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令&#xff0c;都是在命令行上输入的&#xff0c;我们之前对于命令行的理解&#xff1a; 命令行是干啥的&#xff1f;是为我们做命令行解释的。 命令行这个东西实际上是我们…...

git笔记-简单入门

git笔记 git是一个分布式版本控制系统&#xff0c;它的优点有哪些呢&#xff1f;分为以下几个部分 与集中式的版本控制系统比起来&#xff0c;不用担心单点故障问题&#xff0c;只需要互相同步一下进度即可。支持离线编辑&#xff0c;每一个人都有一个完整的版本库。跨平台支持…...

重新刷题求职2-DAY1

DAY1 1.704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 最普通的二分查找&#xff0c;查用的习惯左闭右…...

浅析DDOS攻击及防御策略

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求&#xff0c;耗尽其资源&#xff0c;从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性&#xff0c;使攻击规模更大、影响范围更广…...

路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)

鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…...

SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?

概览 从 SwiftUI 诞生那天起&#xff0c;让秃头码农们又爱又恨的 Xcode 预览就在界面调试中扮演了及其重要的角色。不过&#xff0c;就是这位撸码中的绝对主角却尝尝在关键时刻“掉链子”。 比如当修改 SwiftUI 视图中 FetchedResults 对象的属性时&#xff0c;Xcode 预览可能…...

pytorch实现基于Word2Vec的词嵌入

PyTorch 实现 Word2Vec&#xff08;Skip-gram 模型&#xff09; 的完整代码&#xff0c;使用 中文语料 进行训练&#xff0c;包括数据预处理、模型定义、训练和测试。 1. 主要特点 支持中文数据&#xff0c;基于 jieba 进行分词 使用 Skip-gram 进行训练&#xff0c;适用于小数…...

MVC 文件夹:架构之美与实际应用

MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…...

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...

The Simulation技术浅析(四):随机数生成

随机数生成技术 是 The Simulation 中的核心组成部分,广泛应用于蒙特卡洛模拟、密码学、统计建模等领域。随机数生成技术主要分为 伪随机数生成器(PRNG,Pseudo-Random Number Generator) 和 真随机数生成器(TRNG,True Random Number Generator)。 1. 伪随机数生成器(PR…...

centos stream 9 安装 libstdc++-static静态库

yum仓库中相应的镜像源没有打开&#xff0c;libstdc-static在CRB这个仓库下&#xff0c;但是查看/etc/yum.repos.d/centos.repo&#xff0c;发现CRB镜像没有开启。 解决办法 如下图开启CRB镜像&#xff0c; 然后执行 yum makecache yum install glibc-static libstdc-static…...

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue&#xff08;实现 核心线程->最大线程数->队列&#xff09; 场景1&#xff1a;CPU密集型场景思路&…...

Shell $0

个人博客地址&#xff1a;Shell $0 | 一张假钞的真实世界 我们已经知道在Shell中$0表示Shell脚本的文件名&#xff0c;但在有脚本调用的情形中&#xff0c;子脚本中的$0会是什么值呢&#xff1f;我们通过下面的实例来看。 已测试系统列表&#xff1a; Mac OS X EI Capitan 1…...

C++ Primer 标准库类型string

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

51c嵌入式~电路~合集25

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241709 一、“开关电源”和“普通电源”的区别 什么叫开关电源 随着电力电子技术的发展和创新&#xff0c;使得开关电源技术也在不断地创新。目前&#xff0c;开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电…...

Vue3学习笔记-Vue开发前准备-1

一、安装15.0或更高版本的Node.js node -v npm -v 二、创建Vue项目 npm init vuelatest 三、Vue项目结构 node_modules: Vue项目运行的依赖文件public&#xff1a;资源文件夹package.json&#xff1a;信息描述文件...