利用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 == 3
    Flag_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));
        else
            errordlg('输入参数Old_Color错误,第一行需全部大于第二行','输入错误');
            return;
        end
    else
        errordlg('输入参数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');

        不足之处,敬请斧正!

        转载请说明出处!

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