基于Java的图像象素处理(1)

原文作者: Richard G. Baldwin
翻译: Olajavaman
本文是因为我近期的工作需要用到 Java 处理图像的相关知识, 发现国内关于 Java 如何处理图像象素的文章几乎为零,国外这个 Richard 是一个美国德州的高校教授, 他编写的这个 e 文材料, 通俗易懂, 故想翻译出来给国内的 Java 程序员用, 当然如果您的 e 文很好, 建议看原文, 因为我毕竟非英语专业出身, 翻译不当之处, 还请各位看官多多指点, 另外, 未经本人许可, 这个译文不得随意转载。
l         提纲
l         序言
l         背景材料
l         概论
l         对样例代码的讨论
l         运行程序
l         总结
l         下一步
l         程序清单
序言
目的
这是一篇告诉你如何直接通过 Java 语言操作图象象素的文章。
不是JAI(Java advance Image)的教程
如果您是检索 JAI 的使用, 而找到这个文章, 当然也是受欢迎的   但是 , 我还是要罗嗦一下:这个毕竟不是一个 JAI 的教程, 这个文章向您展示了一个如何利用常规算法直接操作象素以获得一些特殊的图像处理结果泥潭。 .
直接和个别地操作图像象素
在这个教程里面我们将解释如何简单地操作象素:
1.         操作和修改一个特定地图形象素
2.         显示和修改原始图象,如何比较?
程序框架或者是称之为驱动
这个程序可以用于想直接操作图象象素的框架或者驱动的用途
如果将这个程序用为驱动, 你只要关注如何书写和执行图像处理算法, 而不用为如何处理图像文件, 图象显示等等的烦恼。
一个简单的图像象素操作案例
在这个教程中, 我将提供和解释一些如何直接操作象素的图像处理的程序
这个教程的例子只是起到一个抛砖引玉的作用, 但是这个例子和你未来的图像处理意图可能是有关联的。
接下来的教程将展示一些很常见和不太常见的图像处理程序,这些程序包含了:
l         高亮一个图形的某个特殊区域
l         将图像的一个部分和全部模糊
l         将图像的一个部分和全部锐化
l         处理图像边界
l         进行图像的色彩过滤
l         将图像颜色反转
l         将一个图像融入另一个图像
l         旋转一个图像
l         压缩一个图像成更小的尺寸
l         使用线性和非线性算法来控制一个图像的亮度
l         其他的一些我在做这个课题研究时发现图像处理手段
一下图例是一些处理的例子
查看提示
你可以打开两个浏览器来对比这些效果, 会让你更为直观。
 
高亮一个图片
 
这个海星是在鱼缸中拍摄的, 高亮之后它看起来更像是一个潜水员在深海拍摄的效果

Fig(1)
上部是原始图像, 下面是处理之后的图像
这个程序是可以由用户来控制这个聚光灯的射程的, 换句话说,照明的范围(从中心到四周)是可以调节的。
模糊一个图像

图2采用了一个常用算法来模糊一个图像
上部是原始图像, 下面是处理之后的图像
这个模糊度同样也是可控的, 可以由不模糊到完全模糊范围调节
锐化图像
图3展示了图像锐化的算法, 一般来说锐化是用于展示图像的细节。

Figure 3
图3采用的是常用的锐化算法. 当然是否取得良好的结果, 必须由观众的眼睛来评测, 但是我认为是有效果的, 上图下部显示出来的眼角皱纹和指甲的边缘, 都是在上图上部看不清楚的。
边缘检测
这个效果的用途一般是用于高亮两个同一个图像中的不同的物体边缘, 这些边缘一般会出现颜色的变化和产生阴影, 譬如文字或者符号在背景上, 也会产生边缘。
图4您可以看出这个边缘的效果.
Figure 4
您可能非常认可这个算法, 因为我们可以迅速的认出手指, 指甲, 眼睛, 虹膜以及鼻子的轮廓。
 
理论结合实际操作
接下来我会讲一些基本算法理论, 当然包含上面的图例算法, 我也会讲述如何利用Java语言实现这些算法。我还会提到一些应用场合.
 
不承诺
我所提供的算法不是用于高质量的产品设计的, JAI里面已经有许多很好的算法可以用来实现一些用途,我所提供的程序是用来让你了解和开发自己的算法, 同时知道为什么要这样做。
背景知识
图像的结构, 存储和渲染
 
在讲述程序细节之前, 我要讲清一些概念:在Java里面图像是如何构建, 存储, 传输和渲染的。
色点的数组――象素
在现代计算机里面, 为了让人们的视觉感受, 一个图像是由一些点来组成, 这些颜色点很小, 乃至人们的眼睛没法分辨出来他们的距离,所以人们视觉认为是一片连续的颜色。这些色点称之为象素, 我们认为这个也是图像理论的起源。
图像文件
这些象素被存放在文件中, 被一次录入到文件里面, 或者被重构成一个图像, 显而易见, 这么多的象素放在一个文件里面将是一个巨大的文件, 不同的文件格式有不同的压缩算法,还原质量和有利有弊的特点,
对文件格式不敢兴趣
我们对文件格式不敢兴趣, 只是对解压之后的像素感兴趣, 我提供的驱动可以读取gif, jpg和其他的一些格式。
取出象素点
我们最初感兴趣于那些从文件解压出来成一维状态的象素点。 我们将把他们转换成3维的结构, 以利于图像处理,一旦我们理解了这些图像处理的过程, 我们会发现3维的结构更方便处理一些。
颜色象素网格
每个3维的对象对应了一个象素的组成,当我们渲染的时候, 这些网格将按照横竖排序,一条坐标标识了这个象素的横坐标, 另一个是纵坐标, 第3个是这个颜色(和透明度)的值。
返回基础理论
在计算机里面,一个象素由4个字节组成, 其中3个代表R,G, B的值, 另一个是表示透明度或者叫做alpha字节。
RGB的混合
一个颜色都是由R,G,B三种颜色混合而成,也就是说, 我们需要在计算机显示一个颜色是, 就是定义了一定的R,G,B值
颜色的范围
一个无符号位的颜色值可以是0-255(包含255),如果红色为的值是0就表示没有红色被混合在这个颜色里面。
黑和白
如果R=0 G=0 ,B=0这个象素点是黑色, 如果R=255 G=255 ,B=255这个象素点是白色, 如果R=G=B!=0!=255,这个象素颜色就是灰色。
16百万色
在黑色和白色之间, 每个RGB的值都有256中可能, 因此计算机可以显示16百万种颜色, 但是认得眼睛分辨不出来。.
颜色的底线
一个象素是由3个字节来表示他的颜色, 任何一个值的改变, 将改变这个颜色。
透明
我们将解释透明, 这个 alpha 直接也是有256中可能, 如果是0, 表示完全透明, 反之=255的时候, 完全不透明。
0 - 255
作为一个例子, 我们假设你要在一个玻璃的窗户上刷上紫色漆,你可能看不到窗户外面的绿树,这个就是不透明。假设您刷的漆沾性不好, 在它干了以后, 你可能还能透过紫色看到绿树,这个就是很好的描绘了alpha字节的功效,当一个象素被防止在屏幕之后, 又有一个象素在同一个位置被防止, 那么前一个象素是否显示他的颜色将取决于后一个的alpha字节
四个字节被封装成一个整数
当一个图像文件被解压之后, 每个象素被4个字节来表示, 刚好是整数方式, 然而你不要以为真的是一个整数, 确确的说, 整数也是有四个无符号的字节首位相连组成的。
四个字节的顺序
0-      透明度
1-      R 值
2-      G值
3-      B值
我们的任务是要获得这些值, 可以通过移位运算>>和&与运算获得各个字节的值。Java不支持无符号位的算法, 这个让人觉得非常麻烦, 因此我们把一个象素转换成int类型,让算法更为容易一些。
附注
我建议你们也学习一下我的其他的Java练习读物,你可以获得这些课程从这个网站:www.Gamelan.com. 或者在这个网站得到我的文章索引:www.DickBaldwin.com.
预览程序
两个程序一个接口
在这个课程里面我将给出两个程序和两个接口。两个程序是: ImgMod02.java 和 ProgramTest.java.为了方便叙述, 我把这两个程序合在一个源文件里面。
那个ImgMod02 是一个框架程序. 另一个ProgramTest是一个图像处理程序
接口的名字是 ImgIntfc02. 它位于独立的源文件里面。.
processImg 方法
在ProgramTest里面,实现了 ImgIntfc02接口. 这个接口声明了一个方法processImg, 所有实现类必须实例化的方法。
这个方面传递进来的是3维数组, 返回的也是处理过的3维数组。
处理前后的显示
当processImg 返回3维数组之后,我们必须要在画布上绘制原始图像和处理之后的图像
默认图像处理方法
如果用户没有实例化具体的图像处理方法,这个程序将实例化一个ProgramTest对象, 并用ProgramTest的processImg方法
默认的图像文件是junk.gif, 在程序的当前目录中
ProgramTest 的行为
为了方便叙述, 我们在处理ProgramTest 的processImg时, 只是在原始图片时加了一个白线, 如Figure 5所示:
 
 
控制这个斜线
Figure 5 的斜线斜率=1。0,  ProgramTest提供了一个对话框让你设定他的斜率。
透明行为

在画这线的时候,我们设置这个线是不透明的

(待续......)

作者的blog: http://blog.csdn.net/oldjavaman

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值