目录
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');
不足之处,敬请斧正!
转载请说明出处!
路漫漫其修远兮,吾将上下而求索。