17.3.1.6 自定义处理

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

模拟某款图像处理软件的处理,它只留下红色、绿色或者蓝色这样的单一颜色。

首先按照颜色划分了6个色系,分别是 红R、绿G、蓝B、紫P、黄Y、青A,其他N(也就是需要处理为灰度的颜色)。红、绿、蓝三原色分别对应颜色(R=255;G=0;B=0)、(R=0;G=255;B=0)和(R=0;G=0;B=255);紫色对应的是(R=255;G=0;B=255)、黄色对应的是(R=255;G=255;B=0);青色对应的是(R=0;G=255;B=255),其它颜色按照灰度处理用来衬托前面的6个色系颜色。

如果只是按照绝对的RGB颜色值来划分,例如单纯的取红色(R=255,G=0,B=0),其实在图像中是比较少见的,而且和红色接近的颜色(R=236,G=0,B=0),肉眼所见也属于红色范畴。考虑到某个色系颜色其实也是在三原色分量上交错分布(比如红色系并不只是在R分量上线性分布的),如果单纯的将R、G、B值记录到数据库来作为划分的依据,工作量比较大。因此使用以下简单的算法对几种颜色分布进行划分:

1、红色系分布:

R > 128,并且 R - G > 30,并且 R - B > 30。

2、绿色系分布:

G > 80,并且G - R > 5,并且(G - B > 20) 或 (B - G) < 10。

3、蓝色系分布:

B > 80,并且B - R > 50,并且B - G > 30。

4、紫色系分布:

R > 128,并且B > 128,并且R - G > 30,并且B - G > 30。

5、黄色系分布:

R > 140,并且G > 120,并且Math.Abs(G - R) < 40,并且R - B > 80,并且G - B > 80。

6、青色系分布:

G > 180,并且B > 180,并且(B >= G) 或 (G - B) < 10) ,并且B - R > 40,并且G - R > 40。

7、其它颜色:

处理成灰度。

【例 17.40自定义图像处理,保留图像上的单一色系或者多个色系。

       //自定义图像处理private void btnCustom_Click(object sender, EventArgs e){Color pSourceColor;Color pDestColor;Bitmap destImg = new Bitmap(sourceImg.Width, sourceImg.Height);for (int i = 0; i < sourceImg.Width; i++){for (int j = 0; j < sourceImg.Height; j++){pSourceColor = sourceImg.GetPixel(i, j);//根据选择情况,保留选定的色系,其它颜色处理成灰度switch( getSingleColor(pSourceColor)){case "R":if (cbR.Checked == true)pDestColor = pSourceColor;elsepDestColor = getAverage(pSourceColor);break;case "G":if (cBG.Checked == true)pDestColor = pSourceColor;elsepDestColor = getAverage(pSourceColor);break;case "B":if (cbB.Checked == true)pDestColor = pSourceColor;elsepDestColor = getAverage(pSourceColor);break;case "P":if (cbP.Checked == true)pDestColor = pSourceColor;elsepDestColor = getAverage(pSourceColor);break;case "Y":if (cbY.Checked == true)pDestColor = pSourceColor;elsepDestColor = getAverage(pSourceColor);break;case "A":if (cbA.Checked == true)pDestColor = pSourceColor;elsepDestColor = getAverage(pSourceColor);break;default:pDestColor = getAverage(pSourceColor);break;}destImg.SetPixel(i, j, pDestColor);}}picDest.Image = destImg;}//计算所属色系,并返回色系缩写字母private string getSingleColor(Color rgb){byte R, G, B;R = rgb.R;G = rgb.G;B = rgb.B;if((R > 128) && (R - G > 30) && (R - B > 30))return "R";if ((G > 80) && (G - R > 5) && ((G - B > 20) | (B - G) < 10))return "G";if ((B > 80) && (B - R > 50) && (B - G > 30))return "B";if ((R > 128) && (B > 128) && (R - G > 30) && (B - G > 30))return "P";if ((R > 140) && (G > 120) && (Math.Abs(G - R) < 40) && (R - B > 80) && (G - B > 80))return "Y";if((G > 180) &&(B > 180) &&((B >= G) | (G - B) < 10) &&(B - R > 40) &&(G - R > 40))return "A";return "N";}//计算灰度均值,返回灰度颜色private Color getAverage(Color rgb){byte R, G, B;byte gray;R = rgb.R;G = rgb.G;B = rgb.B;gray = (byte)((R + G + B) / 3);Color newColor = Color.FromArgb(gray, gray, gray);return newColor;}

运行结果如下图所示:

图17-44 自定义处理

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

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

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

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

相关文章

基于Arduino UNO设计一个温控制系统

目录 概述 1 硬件结构 1.1 整体硬件介绍 1.2 硬件连接结构 2 软件设计 2.1 软件功能介绍 2.2 关于Arduino的一些知识点 2.2.1 定时器 2.2.2 PWM 2.3 代码实现 2.3.1 编译工具 2.3.2 详细代码 3 测试 3.1 温度数据监控 3.2 温控测试 概述 本文介绍如何使用Ardui…

Rust 语言学习杂谈 (end) (各种工作中遇到的疑难杂症)

1.在运行 “cargo build --release” 的时候&#xff0c;到底发生了什么&#xff1f; 源 (GPT4.0) : 当我们运行 cargo build --release 命令时&#xff0c;实际上在进行一系列复杂的步骤来编译和构建 Rust 项目的发布版本。这个过程大致可以分解为以下几个步骤&#xff1a;…

MCU电源控制(PWR)与低功耗

目录 一、STM32 的内核和外设电源系统管理&#xff1a; 二、MCU电源监控&#xff1a; 三、三种低功耗模式&#xff1a; 1、睡眠模式&#xff1a; 2、停止模式&#xff1a; 3、待机模式&#xff1a; 一、STM32 的内核和外设电源系统管理&#xff1a; ① 电池备份区域&#…

String讲解

文章目录 String类的重要性常用的方法常用的构造方法String类的比较字符串的查找转化数字转化为字符串字符串转数字 字符串替换字符串的不可变性 字符串拆分字符串截取字符串修改 StringBuilder和StringBuffer String类的重要性 在c/c的学习中我们接触到了字符串&#xff0c;但…

【开源图床】使用Typora+PicGo+Github+CDN搭建个人博客图床

准备工作&#xff1a; 首先电脑得提前完成安装如下&#xff1a; 1. nodejs环境(node ,npm):【安装指南】nodejs下载、安装与配置详细教程 2. Picgo:【安装指南】图床神器之Picgo下载、安装与配置详细教程 3. Typora:【安装指南】markdown神器之Typora下载、安装与无限使用详细教…

Flex布局简介及微信小程序视图层View详解

目录 一、Flex布局简介 什么是flex布局&#xff1f; flex属性 基本语法和常用属性 Flex 布局技巧 二、视图层View View简介 微信小程序View视图层 WXML 数据绑定 列表渲染 条件渲染 模板 WXSS 样式导入 内联样式 选择器 全局样式与局部样式 WXS 示例 注意事项…

【Linux系统化学习】文件重定向

目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件&#xff0c;操作系统为了方…

Shellcode免杀对抗(C/C++)

Shellcode C/C免杀&#xff0c;绕过360安全卫士、火绒安全、Defender C/C基于cs/msf的上线 首先是测试一下shellcode上线&#xff0c;主要是俩种方法 测试环境 攻击机&#xff1a;kali2023 靶机&#xff1a;win10 msf方法 首先是启动msf msfconsole 然后msf生成一个sh…

CES 2024:NVIDIA 通过新的笔记本电脑、GPU 和工具提供生成式 AI

在 CES 2024 上&#xff0c;NVIDIA 推出了一系列硬件和软件&#xff0c;旨在释放 Windows 11 PC 上生成式 AI 的全部潜力。 在 PC 上本地运行生成式 AI 对于隐私、延迟和成本敏感型应用程序至关重要。在 CES 上&#xff0c;NVIDIA 将在整个技术堆栈中带来新的创新&#xff0c;…

C#开源免费的Windows右键菜单管理工具

前言 今天分享一个C#开源、免费、纯粹的Windows右键菜单管理工具&#xff1a;ContextMenuManager。 工具主要功能 程序支持国际化多语言显示。启用或禁用文件、文件夹、新建、发送到、打开方式、自定义文件格式、IE浏览器、WinX等右键菜单项目。对上述场景右键菜单项目进行修…

【NI-DAQmx入门】数据采集中的降噪技术

1.什么是噪声&#xff1f; 噪声是电路中存在的与期望信号不同的任何电信号 噪声可以降低&#xff0c;但不能消除 噪声可以在源头处被抑制 通过耦合可以降低数据传输通道的噪声 2.噪声耦合方法 导电性 电容性 感应性 其他 3.传导耦合噪声 来自不同电路的电流在一个公共阻抗中共…

⭐北邮复试刷题103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

AutoKeras(Python自动化机器学习)多模态数据和多任务

要点拓扑 AutoKeras 拓扑 要点 常规机器学习&#xff1a;scikit-learn示例探索性数据分析和数据预处理&#xff0c;线性回归&#xff0c;决策树图像分类ResNet模型示例&#xff0c;合成数据集DenseNet模型示例绘图线性回归和决策树模型使用Python工具seaborn、matplotlib、pan…

论文阅读:四足机器人对抗运动先验学习稳健和敏捷的行走

论文&#xff1a;Learning Robust and Agile Legged Locomotion Using Adversarial Motion Priors 进一步学习&#xff1a;AMP&#xff0c;baseline方法&#xff0c;TO 摘要&#xff1a; 介绍了一种新颖的系统&#xff0c;通过使用对抗性运动先验 (AMP) 使四足机器人在复杂地…

Github项目推荐-Tiny-Rdm

项目地址 GitHub - tiny-craft/tiny-rdm: A Modern Redis GUI Client 项目简述 一个开源的Redis管理工具&#xff0c;有漂亮的界面和丰富的功能。使用的编程语言如下 项目截图

【IIS中绑定SSL证书】

下载SSL证书&#xff1a; 打开服务器IIS&#xff1a; 点击导入 在IIS中新增网站&#xff1a;

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱8(附带项目源码)

效果演示 文章目录 效果演示系列目录前言砍树功能源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存…

NodeJS背后的人:Express

NodeJS背后的人&#xff1a;Express 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2; 文章简单学习总结&#xff1a;如有错误 大佬 &#x1f449;点. 前置知识&#xff1a;需要掌握了解&#xff1a; JavaScript基础语法 、Node.JS环境API 、前端工程\模块化 …

【Linux】程序地址空间 -- 详解 Linux 2.6 内核进程调度队列 -- 了解

一、程序地址空间回顾 在学习 C/C 时&#xff0c;我们知道内存会被分为几个区域&#xff1a;栈区、堆区、全局/静态区、代码区、字符常量区等。但这仅仅是在语言层面上的理解&#xff0c;是远远不够的。 如下空间布局图&#xff0c;请问这是物理内存吗&#xff1f; 不是&…