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;
                            else
                                pDestColor = getAverage(pSourceColor);
                        break;
                        case "G":
                            if (cBG.Checked == true)
                            pDestColor = pSourceColor;
                            else
                                pDestColor = getAverage(pSourceColor);
                            break;
                        case "B":
                            if (cbB.Checked == true)
                                pDestColor = pSourceColor;
                            else
                                pDestColor = getAverage(pSourceColor);
                            break;
                        case "P":
                            if (cbP.Checked == true)
                                pDestColor = pSourceColor;
                            else
                                pDestColor = getAverage(pSourceColor);
                            break;
                        case "Y":
                            if (cbY.Checked == true)
                                pDestColor = pSourceColor;
                            else
                                pDestColor = getAverage(pSourceColor);
                            break;
                        case "A":
                            if (cbA.Checked == true)
                                    pDestColor = pSourceColor;
                                else
                                    pDestColor = 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# 教程 目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.16学习总结

1.邮递员送信&#xff08;dijkstra 不只是从起到到目标点&#xff0c;还要走回去&#xff09; 2.炸铁路(并查集) 3.统计方形&#xff08;数据加强版&#xff09;&#xff08;排列组合&#xff09; 4.滑雪&#xff08;记忆化&#xff09; 5.小车问题&#xff08;数学问题&#x…

二叉树前序中序后序遍历(非递归)

大家好&#xff0c;又和大家见面啦&#xff01;今天我们一起去看一下二叉树的前序中序后序的遍历&#xff0c;相信这个对大家来说是信手拈来&#xff0c;但是&#xff0c;今天我们并不是使用常见的递归方式来解题&#xff0c;我们采用迭代方式解答。我们先看第一道前序遍历 1…

基于Robei EDA实现FIFO(非IP核)及FIFO求和

一、FIFO简介 FIFO&#xff08; First in First out&#xff09; 使用在需要产生数据接口的部分&#xff0c;用来存储、缓冲在两个异步 时钟之间的数据传输。在异步电路中&#xff0c;由于时钟之间周期和相位完全独立&#xff0c;因此数据丢失概 率不为零。使用 FIFO 可以在两个…

【ChatIE】论文解读:Zero-Shot Information Extraction via Chatting with ChatGPT

文章目录 介绍ChatIEEntity-Relation Triple Extration (RE)Named Entity Recognition (NER)Event Extraction (EE) 实验结果结论 论文&#xff1a;Zero-Shot Information Extraction via Chatting with ChatGPT 作者&#xff1a;Xiang Wei, Xingyu Cui, Ning Cheng, Xiaobin W…

【电源】POE系统供电原理(二)

转载本博客文章&#xff0c;请注明出处 ​ 上一篇文章中&#xff0c;有提到POE系统工作原理及动态检测机制&#xff0c;下面我们继续介绍受电端PD技术及原理。POE供电系统包含PSE、PD及互联接口部分组成&#xff0c;如下图所示。 图1 POE供电系统 PSE控制器的主要作用&#xff…

无人机基本知识,无人机遥控器功能详解与调试方法

无人机作为一种新兴的飞行器&#xff0c;近年来在各个领域得到了广泛的应用。而无人机遥控器则是控制无人机飞行的重要工具。 无人机遥控器是一种无线设备&#xff0c;通过它来远程控制无人机的飞行。遥控器通常包括一个或多个摇杆&#xff0c;用于控制无人机的各种动作&#x…

FL Studio 21中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#xff0c;而且F…

【STM32 CubeMX】串口编程DMA+IDLE中断

文章目录 前言一、为什么要引入IDLE中断二、IDLE中断使用方式2.1 接收的三种情况2.2 函数的使用查询方式中断方式DMA方式分析一个问题 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项关键的任务&#xff0c;而使用DMA&#xff08;直接内存访问&#xff09;结合IDLE中断进…

基于springboot特产销售平台源码和论文

“互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多藏区特产销售信息仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;使得对人力物力造成诸多浪费&#xff0c;工作效率不高等情况&…

【初始RabbitMQ】工作队列的实现

工作队列 工作队列&#xff08;又称为任务队列&#xff09;的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程…

电脑屏幕录制工具 Top10 榜单,免费无水印方法集

随着媒体行业的突飞猛进&#xff0c;不同服务之间对有效屏幕录制的竞争日益激烈。这导致市场上出现了质量参差不齐的屏幕录像机。特别是有些录屏器会自动给你录制的视频加上水印&#xff0c;给需要在公共场合使用的人留下不专业的印象。除此之外&#xff0c;它们甚至不能保护您…

【Google Bard】免费生成图像——功能和使用方法详解

Google Bard 关于Bard 图片生成功能打开Bard通过Bard来生成图片Bard Vs Bing Vs Dall-EBard的生成结果Bing的生成结果Dall-E 的生成结果 总结 关于Bard 图片生成功能 Google在2月1日&#xff08;当地时间&#xff09;宣布&#xff0c;其对话型AI“Bard”新增了图像生成功能。 …

Mysql——update更新数据的方式

注&#xff1a;文章参考&#xff1a; MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客文章浏览阅读2w次&#xff0c;点赞20次&#xff0c;收藏70次。一般在更新时会遇到以下场景&#xff1a;1.全部更新&#xff1b;2.根据条件更新字段中的某部分…

MATLAB离线文档安装

MATLAB离线文档安装 来源于最全matlab安装离线文档教程只是对内容进行了精简&#xff0c;同时更方便查找 一、下载离线文档 我上传的2023b离线文档 提供本体属于违规行为&#xff0c;本体下载链接已删除 为方便已安装好软件的朋友想安装离线帮助文档&#xff0c;由于官网下载…

模型 IPO(输入、处理、输出)学习模型

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。信息转化与传递。 1 模型 IPO(输入、处理、输出)学习模型的应用 1.1 项目管理知识体系 PMBOK 中的IPO应用 在项目管理领域&#xff0c;PMBOK&#xff08;Project Management Body of Know…

究极小白如何自己搭建一个自动发卡网站-独角数卡

本人从来没接触过建站&#xff0c;我之前都是在TB上花90叫别人给我搭建的网站&#xff0c;前几天这个TB店倒闭跑路了&#xff0c;而我的发卡网也打不开了&#xff0c;没办法&#xff0c;逼上梁山&#xff0c;自己捣鼓出来了&#xff01;下面是2023/4/2自己建好的&#xff01; …

STM32F1 - 系统时钟SysTick

SysTick 1> SysTick硬件框图2> SysTick的时钟源3> 1ms定时_中断方式4> 思考&#xff1a;无符号数 0 - 255 ?相关资料 1> SysTick硬件框图 SysTick属于Cotex-M3&#xff0c;是CPU外设&#xff1b; SysTick: 位宽24bit&#xff0c; 递减计数&#xff0c;自动重装…

《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)

文章目录 2.1 条件语句&#xff1a;决策的艺术2.1.1 基础知识讲解2.1.2 重点案例&#xff1a;用户角色权限判断实现用户角色权限判断扩展功能实现代码功能扩展&#xff1a;添加或删除用户 2.1.3 拓展案例 1&#xff1a;成绩等级判断实现成绩等级判断功能实现代码扩展功能&#…

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

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

canal监听binlog记录业务数据的变更;canalAdmin对instance做web配置

概述 平时在开发中会通过logback打印一些开发日志&#xff0c;有时也会需要记录一些业务日志&#xff0c;简单的就直接用log记录一下&#xff0c;但是系统中需要记录日志的地方越来越多时&#xff0c;不能每个地方都写一套log记录&#xff1b; 由于平常用的大多都是mysql&…