利用matlab对彩色图片进行颜色变换

最近,遇到了一个问题,我师兄的深度学习代码成功的将荞麦种子分为了三类。将左图转换为了右图,将图中的黑色,灰色,白色而且形状不一的荞麦种子分为了3类。

我要做的就是,分别将右边图中红色的部分、黄色的部分、绿色的部分筛选出来进行处理。这对于初次接触科研的我来说算是一个第一个难题了。那么我的检索关键词就是,颜色变换,经过调研,我发现,用其他颜色空间(例如rgb颜色空间)是不现实的,因为它的感觉是不符合我们人眼观察的感觉的,因此,我们人眼可以直接观察出来的不同,必须选择符合我们人眼的颜色空间,经过筛选,我们选择了HSV颜色空间。

 那么我们的思路就是第一步:将图片转换成HSV空间,方便进一步处理。这一步在matlab中用rgb2hsv这个命令可以轻松的做到。

第二步 就是,知道图片中不同的颜色的H、S、V值,这里,我们需要知道右图中的红黄蓝(还有背景的黑色)的H,S,V值,然后才能根据这三个值对目标像素进行筛选。这里,我们大概了解一下,hsv这三个值大概代表色调,饱和度,亮度。所以大概猜测一下,他们的H值将会是差异最大的。

但是,找到某个像素点的HSV值也费了一点功夫,按照网上说的,直接用PS打开,用拾色器拾取某个地方的HSV值,得到下图

 

 

 将其值带入我们的代码没有成功将目标图像筛选出来。因此,猜想是,这个H的单位是度。S和V是百分比,跟我们需要的不一样,而且,在后面,我们发现在opencv中求取hsv值,用的三个数也有不同,在这里先挖个坑,后续还会用c++实现颜色变换。

最后,我们将目标颜色截取成一个一个小块如下图,是为了方便带入图片,读取hsv值。

 将目标图像读入下面matlab代码之中。

clear all;
clc;
I = imread( 'hong.png' );
hsv = rgb2hsv( I );
H = hsv( :, :, 1 );
S = hsv( :, :, 2 );
V = hsv( :, :, 3 );

 注意(这里,我们的目标图像最好是颜色一致的,否则之后的表格之中需要自己一一对应hsv值)

就这么一个简单的代码,就可以得到他们的hsv值

 

这里我们以他的S值为例,不同的表格,代表不同的像素,如果颜色不均匀,那么表格中的数字将会不同,由于我们用的是一个颜色,所以,他们每个表格的数字是相同的。(这里我猜想,如果表格的位置是相同的,即他们在表格中都是第一行第一列的,那么他们是同一个像素的hsv值,这里hsv分别有三个表格)

 

 根据我们的目标图像,我们得到了三种颜色的HSV值:

红:h:0,s:0.9922,v:0.5020

绿:h:0.3333,s:0.9922v:0.5020

黄:h:0.1667s:0.9922v:0.5020

然后,将原图带入下面的颜色提取的代码中,这里我们以红色为例:

clear all;
clc;
flag = imread('F:\zhanlian\jieguo\20.png'); % 读取图像       
figure;
imshow(flag); % 展示图像     
% 将图像的rgb色彩空间转化至hsv色彩空间
flag_hsv = rgb2hsv(flag);      
% 创建一个黑色图像,将特定颜色提取到此处
flag_new = 0*ones(size(flag));
% 将该图像转至hsv色彩空间
flag_new_hsv = rgb2hsv(flag_new);
% 找出图像中绿色的像素
[row, col] = ind2sub(size(flag_hsv),find(flag_hsv(:,:,1)<0.1...            
& flag_hsv(:,:,2)>0.9 & flag_hsv(:,:,2)<1.1...
& flag_hsv(:,:,3)>0.49& flag_hsv(:,:,3)<0.51));
flag_hsv(:,:,1)=0;
flag_hsv(:,:,2)=0;
flag_hsv(:,:,3)=1

% 将图像中的绿色像素复制到刚才新建的白色图像中
for i = 1 : length(row)
    flag_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
  
end
% 将提取出来的绿色,转化至rgb空间,进行展示
flag_green = hsv2rgb(flag_new_hsv);
figure
imshow(flag_green)

其中,中间这块代码,需要根据你测量出来的HSV值进行更改,

[row, col] = ind2sub(size(flag_hsv),find(flag_hsv(:,:,1)<0.1...            
& flag_hsv(:,:,2)>0.9 & flag_hsv(:,:,2)<1.1...
& flag_hsv(:,:,3)>0.49& flag_hsv(:,:,3)<0.51));
flag_hsv(:,:,1)=0;
flag_hsv(:,:,2)=0;
flag_hsv(:,:,3)=1

其中,flag_hsv(:,:,1)代表H值

flag_hsv(:,:,2)代表S值

flag_hsv(:,:,3)代表V值,

由于红色的H是0,我们设置的是小于0.1,通过实验,我们发现这里的判断部分只能是大于或者小于号,而且只能是约束的数字只能是小数,根据0<0.1,0.9<0.9922<1,0.49<0.5020<0.51我们写出了上图的代码。你可以根据自己的需要进行修改。

根据我们的实验,我们得到了如下的结果,成功将三种颜色的东西分开。

 

 

 

 

 今天的任务就完成了,下一篇写用opencv提取不同的颜色

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值