引文

生活中最常见的RGB图像,比如手机照片,即为标准的三通道24位深RGB图像。 冈萨雷斯和伍兹所著的《数字图像处理》第二版中给出如下定义:一幅RGB图像,可以看作是一个MN3的彩色像素数组,其中每个彩色像素是一个三值组,这三个值分别对应特定空间位置处该RGB图像的红、绿、蓝分量。RGB也可以视为三幅灰度图像形成的“堆叠”,当它们送到彩色显示器时,会**按照一定规则进行组合,并在屏幕上生成一幅彩色图像。因此,按照此约定,我们把形成RGB彩色图像的三幅图像称为红色、绿色、蓝色分量图像。接下来要探讨的便是:如何通过这个规则进行逆变换,实现对RGB彩色图像的分量图像提取。

正文

一、RGB彩色图像简析

在引文部分中已经将RGB图像解释得特别清楚了,在此也可以将RGB图像理解为:
RGB图像是红、绿、蓝三波段图像,按一定规则的叠加得到的新的图像,即:通过对Red红,Green绿,Blue蓝三个通道进行量化,叠加得到一个像素的彩色。在此,核心问题是:这个“堆叠”规则是什么?

先来看一个如下的彩色空间坐标系,可将其初步解读为:在RGB彩色空间模型中,任意空间位置坐标(R,G,B)分量R、G、B按照规则搭配后组成一种颜色。

很显然,R、G、B对应的即是在引文中提到的红色、绿色、蓝色分量图像像素值。

二、彩色图像分量值

接下来,我们看一下已经提取出来的红色、绿色、蓝色波段分量图像和原RGB图像的区别。

以下为:正常图像分离出来的R(红色)、G(绿色)、B(蓝色)三波段的图像。



以下为正常的RGB彩色图像:

至此,我们对RGB图像以及它的分量图像便有了直观的视觉感受,那么:分量图是如何“堆叠”成为RGB图呢?
(1)先要对一个彩色像素值对应的R、G、B分量在内存中分布进行初步认识。

如图:结合RGB图像是3字节,24位深的属性,我们将三个格子视为三个连续字节,即:24位长的存储空间,其中:R所占的位置(共8个字节)用来存放红色分量图的像素值;G所占的位置(共8个字节)用来存放绿色分量图的像素值;B所占的位置(共8个字节)用来存放蓝色分量图的像素值。
(2)那么,问题来了:我们常规思维理解的是只要将代表色彩分量的值(0-255px)直接放在对应位置就好了,但是计算机是一个将一切事物量化存储的系统,它并不认识按照人类思维存放进去的值到底是什么,因此,这里的R、G、B分量存放时,实际上存在一个位运算的过程,即:
R分量将通过左移(16位)运算放到高8位上,G分量通过左移(8位)运算放到中8位上,B分量直接放置到低8位上,由此:我们可以预知,平时我们看到的,或者是通过matlab直接读取出来的像素值,是将R、G、B分量值进行位运算后得到的结果。(当然:计算机里面存储的都是实际数值的补码,关于数值原码、反码、补码的知识,将不在此进行赘述)
由此,可以认识到:只要将对应的红、绿、蓝波段值赋予一张新的图像,并且存放在对应位置上,就可以实现RGB彩色图像的分量提取。
(3)关于RGB分量提取算法,实质上就是对原彩色像素值的位运算。
在java中,可以通过getRGB()方法获取一张图像的彩色像素值,在此假设用预定义的public,int型变量RGB_value来接收此彩色像素值,那么:

r_value=this.RGB_value>>16;
g_value=this.RGB_value>>8;
b_value=this.RGB_value;

对于R、G、B分量值的附加,即:进行相应像素值的相反位运算,将不再进行赘述。

三、java编程实现:RGB图像彩色分量提取

         //定义用来存放RGB图像分量图的image对象(下面用到的this.image是已经预读取来的RGB原图像)BufferedImage this.image_R=new BufferedImage(this.width,this.height,BufferedImage.TYPE_INT_RGB);BufferedImage this.image_G=new BufferedImage(this.width,this.height,BufferedImage.TYPE_INT_RGB);BufferedImage this.image_B=new BufferedImage(this.width,this.height,BufferedImage.TYPE_INT_RGB);//单色通道提取for (int height=0;height<this.height;height++){for (int width=0;width<this.width;width++){this.RGB_value=this.image.getRGB(width,height);//获取方式this.rgb_value[0]=(this.RGB_value&0xff0000)>>16;//红色波段this.rgb_value[1]=(this.RGB_value&0xff00)>>8;//绿色波段this.rgb_value[2]=(this.RGB_value&0xff);//蓝色波段this.image_R.setRGB(width,height,this.rgb_value[0]<<16);this.image_G.setRGB(width,height,this.rgb_value[1]<<8);this.image_B.setRGB(width,height,this.rgb_value[2]);}}//图像输出ImageIO.write(this.image_R,"jpg", new File("C:\\Users\\13241\\Desktop\\WorkPlace\\image_R.jpg"));ImageIO.write(this.image_G,"jpg", new File("C:\\Users\\13241\\Desktop\\WorkPlace\\image_G.jpg"));ImageIO.write(this.image_B,"jpg", new File("C:\\Users\\13241\\Desktop\\WorkPlace\\image_B.jpg"));

结语

至此,关于通过java实现RGB彩色图像分量提取的内容就结束了。因为刚接触对彩色图像的处理,所以还有很多不足,请大家多多指正。谢谢!

RGB彩色图像分量提取(java实现)相关推荐

  1. 通过编写程序工具提取.pal调色板文件为Rgb/Yuv分量数据的文本保存(同时适用于Win7-24位深度的位图和Win10-32位深度的位图)

    一.前言 到做工作记录的时候,本节主要的工作有先保存pal调色板数据位位图,再对位图的数据结构进行分析,再通过源码对数据进行提取,最后通过程序运行进行演示结果.因为Win7和Win10系统保存后的位图 ...

  2. RGB彩色图像、灰度图像

    1.理解RGB彩色图像 ,RGB分量的意义 1.r red,g green,b blue 2.每一种颜色在视觉效果上都可以不同比例的 红 蓝 绿 三种颜色来合成 3.彩色图像的每一个像素,都是用 红蓝 ...

  3. 小波变换(分解/重构)和彩色图像分量处理

    小波变换 小波分析 小波变换分成两个大类:离散小波变换(DWT) 和连续小波转换(CWT).两者的主要区别在于,连续变换在所有可能的缩放和平移上操作,而离散变换采用所有缩放和平移值的特定子集.所有小波 ...

  4. python opencv二值化图像_python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘...

    python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘 python opencv 1,读取图像 2,图像变矩阵 3,图像转灰度图像 4,彩色图像是3D数组 5,灰度图像是2 ...

  5. java集合提取最小的日期_提取Java集合的元素-Java 8方法

    java集合提取最小的日期 我们都广泛使用了Collection类,例如List,Map及其派生版本. 每次使用它们时,我们都必须遍历它们以找到某个元素或更新这些元素,或者找到匹配某个条件的不同元素. ...

  6. 提取Java集合的元素-Java 8方法

    我们所有人都广泛使用了Collection类,例如List,Map及其派生版本. 每次使用它们时,我们都必须遍历它们以找到某个元素或更新这些元素,或者找到匹配某个条件的不同元素. 考虑如下所示的人员列 ...

  7. 使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

    一.  所需结构体 CvScalar 结构体介绍 typedef struct CvScalar { double val[4]; //BGRA}CvScalar; 二. 所需函数 cvGet2D 函 ...

  8. 各种视频输出端口(HDMI、DVI、VGA、RGB、分量、S端子)图片说明 .

    各种视频输出端口(HDMI.DVI.VGA.RGB.分量.S端子)图片说明 1.S端子 标准S端子 标准S端子连接线 音频复合视频S端子色差常规连接示意图 S端子(S-Video)是应用最普遍的视频接 ...

  9. MATLAB对RGB彩色图像进行加马赛克处理

    简单实现MATLAB对RGB彩色图像进行加马赛克处理 为了加深对图像中像素块操作的记忆,利用像素块内均值方式对RGB彩色图像进行马赛克效果的处理:为了能后比较简单得实现,所以采用了n*n像素块大小的均 ...

最新文章

  1. 【深度学习理论】(3) 激活函数
  2. 人人出售部分Social Finance 股票 获益9190万美
  3. [转]JAVA泛型通配符T,E,K,V区别,T以及ClassT,Class?的区别
  4. 今日话题:月薪过万真的很难吗?
  5. java io null异常,java.io.IOException:所有收集器的初始化失败。最后一个收集器中的错误是:null...
  6. 错误:”未能加载文件或程序集“System.Web.Mvc, Version=2.0.0.0” 解决方法
  7. MATLAB(六)数据处理
  8. lol手游账号被移至美洲服务器,LOL手游“行窃预兆”遭玩家嫌弃,移除偷钱后成最鸡肋符文?...
  9. UT源码105032014052
  10. 价量分析.成交量判断多空头.用跌减涨增量法买股票.成交量识庄家
  11. 皮肤html代码大全,清新QQ空间免费皮肤代码大全(可用)
  12. 科学研究设计七:单案例设计
  13. Golang复杂json结构体解析
  14. win10卸载程序灾难性故障_win10新建文件夹出现0X8000FFFF:灾难性故障的错误提示解决方法...
  15. Java笔记 - 黑马程序员_06(Stream,字节流,字符流,对象流(序列化流),属性集(Properties))
  16. Notion、印象笔记、Roam research…不知道笔记系统构建方式!怎么能选到对的笔记应用?
  17. 无需编程,DIY自己智能小车的Android蓝牙遥控软件(一)
  18. JavaScript沙箱(环境,黑盒)
  19. cass怎么添加指北针图例_答疑|CASS怎么添加图例?
  20. Unity的Socket网络编程

热门文章

  1. MFC中CString.Format的详细用法和进制转换
  2. angular12项目对IE浏览器的支持
  3. AI——四(填充效果和混合效果)
  4. labview怎么设置中文_小米手机怎么弄抖音中文数字时钟罗盘屏保 设置动态壁纸教程...
  5. 安恒西湖论剑线下上午CTF部分题目WP
  6. 大学毕业要写多少行代码,才能不用花钱培训就找到一份开发工作?
  7. VC++获取电脑的各个磁盘盘符及容量信息(附源码)
  8. Flutter Android 打包保姆式全流程 2023 版
  9. 算法笔记- K均值(K-Means)
  10. Caj怎么复制里面的文字或进行修改?