利用Matlab替换图片部分颜色

目录

1. 需求分析

2. 技术分析

3. 程序代码


1. 需求分析

        日常工作、研究、学习当中,往往需要对图片进行处理。其中图片重新着色、渲染是非常常见的。比如说去掉或则更换证件照底色;去掉遥感图像中黑边……为解决此类问题,而编写此代码。

2. 技术分析

        图片处理主要其中有两个重要步骤:a.提取目标位置,获取索引;b.着色、渲染等处理;本代码也是按照这两个步骤来写的:a.利用find函数提取目标,获取其索引;b. 再根据索引,进行着色渲染处理。find函数用法如下:

find - 查找非零元素的索引和值此 MATLAB 函数 返回一个包含数组 X 中每个非零元素的线性索引的向量。k = find(X)k = find(X,n)k = find(X,n,direction)[row,col] = find(___)[row,col,v] = find(___)

3. 程序代码

        根据技术分析,进行编程。本人在网上找到一段相关代码,并基于此进行进一步编程。源代码如下:

clear;close all;clc;image = imread('测试.JPG');                      % 读取图像
figure('Name','原图')
imshow(image);                                  % 显示
R = image(:,:,1);                               % 红色
G = image(:,:,2);                               % 绿色
B = image(:,:,3);                               % 蓝色index = find(R<20 & G<20 & B<20);               % 索引,找出被替换颜色的范围
R(index) = 255;                                 % 红色通道赋值
G(index) = 255;                                 % 绿色通道赋值
B(index) = 255;                                 % 蓝色通道赋值
Out_Image(:,:,1) = R;                           % 输出图像红色通道
Out_Image(:,:,2) = G;                           % 输出图像绿色通道
Out_Image(:,:,3) = B;                           % 输出图像蓝色通道
figure('Name','颜色改变之后的图')
imshow(Out_Image);                              % 显示输出图像

        上面这段代码来自:利用matlab代码怎么将黑色变为白色,而红色不变 – MATLAB中文论坛

       本人将这个功能实现整合成一个函数Color_Con,必输输入侧参数有照片路径,可选参数有所替换的(某种或某类)颜色、需要赋予的新颜色以及输出的文件名,本人在程序中详细介绍了其用法,并对代码进行详细明了的注释,不懂之处可以咨询。代码如下:

function Color_con(Image_Name,Old_Color,New_Color,Flag_C,varargin)%==================================说明====================================
%   图像颜色转换
%   函数作用:用于将图中某种(类)颜色转化成另一种颜色
%
%   作者:胡礼珍
%   单位:厦门大学联合遥感接收站
%   邮件:hulizhen@xmu.edu.cn
%
%   输入:
%       Image_Name  彩色图像(必须的,灰白图像不行)
%       Old_Color   需要被替换的颜色,必须是1×3矩阵,或者是2×3矩阵;
%                   1.当为1×3矩阵,若Flag_C为yes,则表示替换某种颜色,
%                   Flag_C为no时,则表示替换
%                   ([0:Old_Color(1)],[0:Old_Color(2)],[0:Old_Color(3)]);
%                   2. 当为1×3矩阵,若Flag_C为yes,则表示替换某种Old_Color(1,:)颜色,
%                   Flag_C为no时,则表示替换:
%                   ([Old_Color(2,1):Old_Color(1,1)],
%                    [Old_Color(2,2):Old_Color(1,2)],
%                    [Old_Color(2,3):Old_Color(1,3)]);
%                   注:Old_Color(1,:)>=Old_Color(2,:) 必须为真才行
%       New_Color   想要的颜色,具体的某一种颜色[R G B]
%       Flag_C      用于判断被替换的颜色是某一类颜色还是某一种颜色,
%                   默认为某一种颜色;
%                   1. 如果Flag_C为“Yes”则表示改变某一种颜色;
%                   2. 如果Flag_C为“N0”则表示改变某一类颜色
%                       颜色范围为:
%                       ([0:Old_Color(1)],[0:Old_Color(2)],[0:Old_Color(3)]);
%                       注:[a:b]表示值域:a≤x≤b
%                   %   输出:
%       无,但会生成一个修改后的图片
%   语法:
%   Color_con(Image_Name,Old_Color,New_Color)
%   Color_con(Image_Name,Old_Color,New_Color,Flag_C)
%   保存文件的格式有:
%--------------------------------------------------------------------------
%   https://www.ilovematlab.cn/thread-574152-1-1.html
%==========================================================================
narginchk(3,4);             % 输入参数个数必须是3-4个,否则报错
nargoutchk(0,0);            % 输出参数个数必须是0个,否则报错if nargin == 3Flag_C ='yes';          % 如果只有三个输入,则默认Flag_C为yes
end
Image = imread(Image_Name);                     % 读取图像
figure('Name','原图')
imshow(Image);                                  % 显示
R = Image(:,:,1);                               % 红色
G = Image(:,:,2);                               % 绿色
B = Image(:,:,3);                               % 蓝色if Flag_C == "yes"              % 1. Flag_C参数为yes,替换某一种颜色index = find(R==Old_Color(1,1) & G==Old_Color(1,2) & B==Old_Color(1,3));
elseif Flag_C == "no"           % 2. Flag_C参数为no,替换某一类颜色[row,col]=size(Old_Color);  % 计算矩阵大小if row == 1 && col ==3      % 2.1 当为1×3矩阵时;index = find(R<=Old_Color(1) & G<=Old_Color(2) & B<=Old_Color(3));elseif row == 2 && col ==3  % 2.2 当为2×3矩阵时;if Old_Color(1,:)>=Old_Color(2,:)       % 第一行元素必须大于第二行index = find(R<=Old_Color(1) & R>=Old_Color(2) & ...G<=Old_Color(3) & G>=Old_Color(4) & ...B<=Old_Color(5) & B>=Old_Color(6));elseerrordlg('输入参数Old_Color错误,第一行需全部大于第二行','输入错误');return;endelseerrordlg('输入参数Old_Color错误,矩阵大小不对','输入错误');return;end 
else                            % 3. 其它类型字符串errordlg('输入参数Flag_C错误,不是yes或no','输入错误');return;
end% 索引,找出被替换颜色的范围
% index = find(R==Old_Color(1) & G==Old_Color(2) & B==Old_Color(3));R(index) = New_Color(1);                                 % 红色通道赋值
G(index) = New_Color(2);                                 % 绿色通道赋值
B(index) = New_Color(3);                                 % 蓝色通道赋值Out_Image(:,:,1) = R;                           % 输出图像红色通道
Out_Image(:,:,2) = G;                           % 输出图像绿色通道
Out_Image(:,:,3) = B;                           % 输出图像蓝色通道figure('Name','颜色改变之后的图')
imshow(Out_Image);                              % 显示输出图像
imwrite(Out_Image,'Out_Image.png');
end

        调用上面函数的代码(主程序),三种用法都做了测试,具体如下:

clear;close all;clc;
% 第 1 种用法
Color_con('测试.png',[0 0 0],[255 0 0],'yes');
% 第 2 种用法
% Color_con('测试.png',[20,20,20],[255 0 0],'no');
% 第 3 种用法
% Color_con('测试.png',[20,20,20;0 0 0],[255 0 0],'no');

        不足之处,敬请斧正!

        转载请说明出处!

路漫漫其修远兮,吾将上下而求索。

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

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

相关文章

十万个为什么儿童版_把中国科技传播至阿语地区,少儿社《十万个为什么》阿拉伯文版亮相童书展...

在11月13日至15日举行的第八届上海国际童书展上&#xff0c;少年儿童出版社的《十万个为什么》阿拉伯文版亮相。该书于2020年正式出版&#xff0c;中国的科技成果将沿着“一带一路”&#xff0c;传播至2.9亿人口所在的阿语地区。《绘心寓意中国古代寓言典藏图画书 曾子不撒谎》…

利用Matlab判断某些点是否在多边形区域内

目录 1. 代码作用及实现效果 2. 技术分析&#xff1a; 3. 程序 1. 代码作用及实现效果 先给各位看看具体效果&#xff0c;如下所示&#xff0c;其中红色的点表示需要判断的点&#xff0c;是否在蓝色区域内&#xff0c;从图中可知&#xff0c;有两个点在蓝色区域内&…

spark1.0和2.0的区别_【系统】华为正式发布鸿蒙OS 2.0手机Beta版:UI界面、交互无区别...

今天上午&#xff0c;华为正式发布了鸿蒙OS 2.0手机开发者Beta版本&#xff0c;HarmonyOS 是面向万物互联时代的全场景分布式操作系统&#xff0c;华为希望和合作伙伴、开发者一起打造面向万物互联时代的超级终端体验。目前也已经开启了公测招募活动&#xff0c;不过报名还是有…

Matlab 纯代码进行GUI界面编程

Matlab界面编程传统的有guide&#xff0c;现在matlab朝着appdesigner方向发展。这两种方法都是非常简单适合新手的&#xff0c;如果是一个未接触这方面的&#xff0c;我建议直接学APPdesigner&#xff0c;如果想了解更深入&#xff0c;可以尝试利用纯代码进行编程。 编程要点…

深入到系统组件是否白盒测试_2019年系统集成项目管理工程师:第一章 信息化知识(三)要点?...

今天幸福哥助理继续为大家分享第一章 第三节 信息化知识(二) 信息系统设计、软件工程及面向对象系统分析与设计等复习知识要点&#xff0c;备考笔记知识点的分享会不定期整理&#xff0c;如果你正好参加这个考试&#xff0c;可以关注我&#xff0c;收藏&#xff0c;或者转发。一…

IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置

目录 1. 文本文件编码设置 2. 自动补全设置 3. IDL doc设置 4. 格式器设置 5. 显示行号 每种编程语言的某些设置&#xff08;快捷键、显示风格&#xff09;都大相径庭&#xff0c;因此需要需要对一些显示&#xff0c;使得更符合自己的编程习惯&#xff0c;方便用起来得心…

IDL学习(对象):IDLffShape

目录 一、描述 二、创建 三、属性 3.1 ATTRIBUTE_INFO 3.2 ATTRIBUTE_NAMES 3.3 DBF_ONLY 3.4 ENTITY_TYPE 3.5 FILENAME 3.6 IS_OPEN 3.7 N_ATTRIBUTES 3.8 N_ENTITIES 3.9 N_RECORDS 3.10 UPDATE 四、方法&#xff1a; 4.1 IDLffShape::AddAttribute 4.2 IDLff…

tablueau地图标记圆形_30天30张中国风地图,从青绿山水到秦砖汉瓦

本文来自#30天制图挑战#的GISer November_阿瑜瑜瑜瑜&#xff0c;完成了30幅中国风专辑地图&#xff0c;唯美又有韵味&#xff0c;十分赏心悦目&#xff0c;简直把中国风玩出了花~接下来&#xff0c;快来跟着小编一起细品30幅中国风地图吧~~~ 01day 1千里江山图《千里江山图》是…

IDL学习:语法基础-变量

目录 1. 变量命名规则 2. 数据类型 3. 基本操作 3.1 数据类型选择 3.2 改变数据类型 3.3 科学计数法 1. 变量命名规则 与其他编程语言一样&#xff0c;IDL也有自己的变量命名规则&#xff1a; 字符规则&#xff1a;首字母必须是26个英文字母&#xff0c;且只能由字母、数…

语言省考安徽考区_安徽省中小学新任教师公开招聘统一笔试 中学信息技术学科考试大纲...

一、考试性质安徽省中小学新任教师公开招聘考试为全省统一组织的公开性选拔考试&#xff0c;是落实“省考、县管、校用”教师管理体制的基础工作。其目的是吸引有志于从事基础教育事业的优秀人才到中小学任教&#xff0c;进一步规范中小学新任教师公开招聘工作&#xff0c;把好…

IDL学习:语法基础-数组

目录 1. 创建数组 1.1 直接创建 1. 2 利用函数创建 2. 数组索引 3. 数组操作 3.1 数组的信息 3.2 数组维度变化 3.3 数组的最大值和最小值 3.4 数组方差、均值、标准差、总和运算 3.5 数组元素筛选及重新赋值 3.6 数组元素的排序 3.7 数组间比较 4. 数组运算 4.…

amd为什么还用针脚_为什么AMD不取消cpu上的针脚?

在过去&#xff0c;AMD的速龙系列处理器也使用了LGA触点式接口。包括AMD的皓龙在内的一系列服务器处理器也使用类似于英特尔的LGA接口&#xff0c;但AMD多年来一直在消费级CPU上使用针脚式接口。这样做很好&#xff1f;为什么&#xff1f;这是因为在Intel切换到触点式接口之后&…

IDL学习:语法基础-字符串

1. 创建字符串 IDL中可以用单引号‘’或双引号""来创建字符转 >>a hlz >>b "hlz" >>a eq b1 创建字符串数组&#xff0c;可以利用中括号[]和逗号,相组合的方式进行创建 >>a [Hlz,XMU,厦门] >>a Hlz XMU 厦门 &g…

epoll监听文件_epoll使用详解

epoll介绍epoll的行为与poll(2)相似&#xff0c;监视多个有IO事件的文件描述符。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外&#xff0c;还提供了边缘触发(Edge Triggered)&#xff0c;这就使得用户空间程序有可能缓存IO状态&#xff0c;减少epoll_wait…

IDL学习:语法基础-结构体

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“属性”&#xff08;亦称之为“成员”&#xff09;&#xff0c;这些成员可以是变量、数组、字符串以及结构等类型数据。IDL中常用于函数返回值&#xff08;PS&#xff1a;因为IDL中函数最多…

hdfs数据节点分发什么协议_分布式文件系统HDFS解析

Hadoop 主要由HDFS和MapReduce 引擎两部分组成。最底部是HDFS&#xff0c;它存储Hadoop 集群中所有存储节点上的文件。HDFS 的上一层是MapReduce 引擎&#xff0c;该引擎由JobTrackers 和TaskTrackers组成。一、HDFS基本概念1、数据块HDFS默认的最基本的存储单位是64M的数据块&…

IDL学习:语法基础-指针、链表

本博客将介绍IDL语法基础中的指针、链表的创建及相关的用法。记录自己的学习整理理解 。 1. 指针 指针也就是内存地址&#xff0c;是用来存放内存地址的变量&#xff0c;指针可以理解为通讯地址&#xff0c;可以通过通讯地址查询具体的信息&#xff0c;而指针可以查询所指向的…

计算机等级考试java题型_计算机二级考试《java》试题及答案

计算机二级考试《java》试题及答案2017下半年计算机二级考试将于9月23日-26日举行&#xff0c;下面是小编为大家整理的计算机二级考试《java》试题及答案&#xff0c;欢迎参考~计算机二级考试《java》试题及答案一、判断题1. Java语言中的数组元素下标总是从0开始&#xff0c;下…

IDL学习:语法基础-对象、哈希表

本博客将介绍IDL语法基础中的对象、哈希表的创建及相关的操作发法。哈希表、链表都可以看做对象&#xff0c;包含了add、reserve、Sort等方法。记录自己的学习整理理解 。 1. 对象 对象是数据&#xff08;属性&#xff09;和程序&#xff08;方法&#xff09;封装在一起的实体…

hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...

本人有一个3节点hadoop, 启动了3个docker容器, 众所周知, docker容器内服务的端口是可以映射到宿主机的端口的, 我采用-P将容器的所有端口映射到主机端口, 命令如下:docker run -it -v /Users/yc/hadoop/docker:/test -P -h h1 --name h1 sequenceiq/hadoop-docker /etc/bootst…