Matlab提取图像的RGB分量以及RGB的阈值分割

本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。

原图像

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

Matlab提取RGB颜色分量:

我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。

例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);

在工作区中可以看到其数值。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量

运行代码:


clc; 
close all; 
clear all; 
I=imread('test.bmp');%要求你.m文件下有test.bmp这个图像文件 
PR=I(:,:,1);%提取红色分量 
PG=I(:,:,2);%提取绿色分量 
PB=I(:,:,3);%提取蓝色分量 

figure; 
subplot(2,2,1);imshow(I);title('原图像'); 
subplot(2,2,2);imshow(PR);title('提取红分量后'); 
subplot(2,2,3);imshow(PG);title('提取绿色分量后'); 
subplot(2,2,4);imshow(PB);title('提取蓝色分量后');


运行的效果图:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

RGB阈值分割

上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

因此,我们使用图像的阈值分割。

阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。

源自参考文档:
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。

基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。

常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。

实现代码:


clc; 
close all; 
clear all; 
I=imread('test.bmp'); 
[m,n,d]=size(I); 

level=15;%设置阈值 
level2=70;%设置阈值 

for i=1:m 
    for j=1:n 
        if((I(i,j,1)-I(i,j,2)>level2)&&(I(i,j,1)-I(i,j,3)>level2)) 
            r(i,j,1)=I(i,j,1); 
            r(i,j,2)=I(i,j,2); 
            r(i,j,3)=I(i,j,3); 
       else  
            r(i,j,1)=255; 
            r(i,j,2)=255; 
            r(i,j,3)=255; 
        end 
    end 
end 

figure; 
subplot(2,2,1);imshow(I);title('原图像'); 
subplot(2,2,2);imshow(r);title('提取红分量后');%显示提取红分量后的图 


%提取绿分量,不满足阈值的变为白色 
for i=1:m 
    for j=1:n 
        if((I(i,j,2)-I(i,j,1)>level)&&(I(i,j,2)-I(i,j,3)>level)) 
            g(i,j,1)=I(i,j,1); 
            g(i,j,2)=I(i,j,2); 
            g(i,j,3)=I(i,j,3); 
        else 
            g(i,j,1)=255; 
            g(i,j,2)=255; 
            g(i,j,3)=255; 
        end 
    end 
end 

subplot(2,2,3);imshow(g);title('提取绿分量后'); 


%提取蓝色分量 
for i=1:m 
    for j=1:n 
        if((I(i,j,3)-I(i,j,1)>level)&&(I(i,j,3)-I(i,j,2)>level)) 
                    b(i,j,1)=I(i,j,1); 
                    b(i,j,2)=I(i,j,2); 
                    b(i,j,3)=I(i,j,3); 
        else 
            b(i,j,1)=255; 
            b(i,j,2)=255; 
            b(i,j,3)=255; 
        end 
    end 
end 

subplot(2,2,4);imshow(b);title('提取蓝色分量后');


运行结果图:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

图像中去除某一个区域

比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

解决方法:

这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。

代码实现:


copy_image = I; 
r = 50:100;%要赋值的行坐标 
c = 20:300;%要赋值的列坐标 
copy_image(r,c,1:3) = 255; 

figure; 
imshow(copy_image);



运行结果:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在将其进行图像分割,即可将原来的矩形去除:

参考文档:

RGB图像中特定颜色的提取

  • 71
    点赞
  • 562
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值