Java图像处理最快技术:ImageJ 学习第一篇
ImageJ是世界上最快的纯Java的图像处理程序。
它能够过滤一个2048x2048的图像在0.1秒内(*)。
这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的ImageJ的开发插件。500多插件可用。
打开和保存GIF,JPEG,BMP,PNG。PGM,FITS和ASCII。打开DICOM。使用URL打开的TIFF、GIF文件、JPEG文件、DICOMs和原始数据。也能够扩展很多其它格式 的插件。
交互方式调整亮度和8位,16位和32位图像的对照度。
測量长度和角度。使用现实世界中的度量单位。如毫米。校准使用密度标准。生成柱状图和剖面图。
合并8位组件成彩色图像。RGB图像转换为8位索引颜色。应用伪彩色调色板为灰度图像。
ImageJ的 图像由三个部分组成:1、ImageProcessor对象实例:持有并提供了訪问像素的方法。2、Image对象实例:即java.awt.Image画在屏幕上。3、ImagePlus对象实例:包括全部的元数据(标题,属性)、ImageProcessor和Image。ImageJ的 图像堆栈由四部分组成:1、ImageStack对象实例:持有像素阵列的阵列(LUT变化通过暂时实例StackProcessor)2、Image对象实例:即java.awt.Image画在屏幕上。3、ImageProcessor对象实例:提供訪问当前切片像素。4、ImagePlus对象实例:持有ImageStack、ImageProcessor和Image。使用堆栈时,要谨记以下几点:1、ImagePlus的ImageProcessor实例在不论什么调用setSlice(INT)时都由它的像素替换对象。2、ImageStack.getProcessor(int)在每次调用时都返回一个新的ImageProcessor。是 一个消耗大的操作。3、ImagePlus的java.awt.Image中在每次调用setSlice(int)时被更新。
当ImagePlus调用updateAndDraw()时又一次创建 java.awt.Image对象。假设你想改变被反映当前显示在屏幕上的图像,必须改动的像素之后调用updateAndDraw()。
;
;
ImageProcessor ip = new ByteProcessor(width, height);
String title = "My new image";
ImagePlus imp = new ImagePlus(title, ip);
imp.show();
new image", , )).show();
ImagePlus imp , , );
imp.show();
// or, without getting back a reference:
IJ.newImage(, , );
B、堆栈的400×400像素的10色图片
ImagePlus imp , , );
imp.show();
// again, without getting back a reference:
IJ.newImage(, , );
三、销毁图像
调用flush()将释放所使用的ImagePlus全部内存资源。
ImagePlus imp = ...
imp.flush();
注意:假设你持有一个从ImagePlus.getProcessor()方法获得ImageProcessor。即ImageProcessor的像素数组指针将被设置为null。你应该改为调用ImageProcessor的duplicate()。或直接通过getPixels()得到它的像素。并把它们存储在相同的尺寸的新ImageProcessor。
相同,java.awt.Image中获取自己的flush()方法调用也是如此。
imp.show();
ImagePlus imp = IJ.openImage("http://www.example.org/path/to/image.tif");
imp.show();
// Without getting back a pointer, and automatically showing it:
IJ.open("/path/to/image.tif");
// Same but from an URL
IJ.open("http://www.example.org/path/to/image.tif");
Opener opener = new Opener();
ImagePlus imp = opener.openImage("/path/to/image.tif");
imp.show();
Opener opener = new Opener();
ImagePlus imp = opener.openImage("http://www.example.org/path/to/image.tif");
imp.show();以上注意URL 包括http://怎样的自己主动检測并正确解析。假设须要,能够直接调用:
ImagePlus imp = opener.openURL("http://www.example.org/path/to/image.tif");
五、编辑像素
1、执行ImageJ命令方式,这是一个高层次的方法,像素能够通过调用ImageJ的命令编辑图像:
ImagePlus imp = ...
// Making a binary image
IJ.run(imp, "Convert to Mask", ""); // "" means no arguments
// Resizing, opens a copy in a new window (the 'create' command keyword)
IJ.run(imp, "Scale...", "x=0.5 y=0.5 width=344 height=345 interpolate create title=[Scaled version of " +imp.getTitle() + "]");
...不论什么ImageJ命令可能被应用。你能够找出哪些命令来使用,哪些參数通过执行插件,并手动调用的ImageJ打开的图像上的菜单命令。
2、中级层次编辑方式:ImageProcessor(ROIs/selections)在图像上绘制或填充ROI(感兴趣区域):
ImagePlus imp = ...
ImageProcessor ip = imp.getProcessor();
// Assuming 8-bit image
// fill a rectangular region with 255 (on grayscale this is white color):
Roi roi , , , ); //
x, y, width, height of the rectangle
ip.setRoi(roi);
ip.setValue();
ip.fill();
// fill an oval region with 255 (white color when grayscale LUT):
OvalRoi oroi , , , ); //
x, y, width, height of the oval
ip.setRoi(oroi);
ip.setValue();
ip.fill(ip.getMask()); // notice different fill method
// regular fill() would fill the entire bounding box rectangle of the OvalRoi
// The method above is valid at least for PolygonRoi and ShapeRoi as well.
// draw the contour of any region with 255 pixel intensity
Roi roi = ...
ip.setValue();
ip.draw();
// update screen view of the image
imp.updateAndDraw();3、ROIs的一些事情:A、有非常多selection/ROI类型:Roi(矩形之中的一个。也是全部其它类型的父类),Line, OvalRoi, PolygonRoi, PointRoi, FreehandRoi, ShapeRoi, TextRoi。另外有一些子类型。如PolygonRoi里的POLYGON、POLYLINE 类型。
B、大部分的ROI是用于编辑图像非常实用; 一些用于图像分析(Line。PointRoi。TextRoi)。C、最强大的ROI是ShapeRoi:java.awt.geom.GeneralPath支持它,它能够存储随意数量的不论什么形状的不连续区域的。D、ip.fill(ip.getMask())方法是最安全的,可在各种场合使用,仅仅须要检查ImageProcessor的mask通过getMask()返回的不为null。旋转。翻转和缩放图像(或者ROI)
ImagePlus imp = ...
ImageProcessor ip = imp.getProcessor();
ip.flipHorizontal();
ip.flipVertical();
ip.rotateLeft();
ip.rotateRight();
;
ip.setInterpolate(true); // bilinear
ip.rotate();
;
IJ.run(imp, "Arbitrarily...", "angle=" + angle + " grid=1 interpolate enlarge");
// scale WITHOUT modifying the canvas dimensions
ip.setInterpolate(true); // bilinear
ip.scale(., .); // in X and Y
.;
.;
int new_width = (int)(ip.getWidth() * sx);
int new_height = (int)(ip.getHeight() * sy);
ip.setInterpolate(true); // bilinear
ImageProcesor ip2 = ip.resize(new_width, new_height); // of the same type as the original
imp.setProcessor(imp.getTitle(), ip2); // UPDATE the original ImagePlus
// update screen view of the image
imp.updateAndDraw();ImageProcessor类提供了绘制线条、文字和点等。看看在ImageProcessor的API。4、低层次的编辑方式:像素数组
ImagePlus imp = ...
ImageProcessor ip = imp.getProcessor();
// Editing the pixel array
if (imp.getType() == ImagePlus.GRAY8) {
byte[] pixels = (byte[])ip.getPixels();
// ... do whatever operations directly on the pixel array
}
// Replacing the pixel array: ONLY if same size
if (imp.getType() == ImagePlus.GRAY8) {
int width = ip.getWidth();
int height = ip.getHeight();
byte[] new_pixels = new byte[width * height];
// set each pixel value to whatever, between -128 and 127
; y<height; y++)
{
; x<width; x++)
{
// Editing pixel at x,y position
new_pixels[y * width + x] = ...;
}
}
// update ImageProcessor to new array
ip.setPixels(new_pixels);
}
.);
.);
ImageProcessor ip2 = ip.createProcessor(new_width, new_height); // of same type
imp.setProcessor(imp.getTitle(), ip2);
if (imp.getType() == ImagePlus.GRAY8) {
byte[] pix = (byte[])imp.getProcessor().getPixels(); // or ip2.getPixels();
// .. process pixels ...
; y<height; y++)
{
; x<width; x++)
{
// Editing pixel at x,y position
new_pixels[y * width + x] = ...;
}
}
}
// DON'T forget to update the screen image!
imp.updateAndDraw();假设要显示的ImagePlus,更新图像仅仅有必须的,
六、保存图像
1、高层次的方式
ImagePlus imp = ...
IJ.saveAs(imp, "tif", "/path/to/image.tif");
// or by using the file format extension:
IJ.save(imp, "/path/to/image.tif");2、通过FileSaver类
ImagePlus imp = ...
new FileSaver(imp).saveAsTiff("/path/to/image.tif");该FileSaver类有很多其它的选择:saveAsTiffStack。saveAsJpeg,saveAsPng。saveAsGif ...等。这算是ImageJ入门第一篇,介绍一些基本操作,它的扩张机制和实现方式都非常值得研究。希望很多其它的人參与进来。
Java图像处理最快技术:ImageJ 学习第一篇的更多相关文章
- ImageJ 学习第一篇
ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Image ...
- 从.Net到Java学习第一篇——开篇
以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...
- Java并发包下锁学习第一篇:介绍及学习安排
Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...
- JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇
JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇 作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题).我们也知道我们Java程序 ...
- Java基础知识常见面试题汇总第一篇
[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后 ...
- LINQ to XML LINQ学习第一篇
LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...
- Android基础学习第一篇—Project目录结构
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署
序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...
- Python学习第一篇
好久没有来博客园了,今天开始写自己学习Python和Hadoop的学习笔记吧.今天写第一篇,Python学习,其他的环境部署都不说了,可以参考其他的博客. 今天根据MachineLearning里面的 ...
随机推荐
- 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)
一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...
- linux yum 安装软件
概括了部分常用的yum命令包括: 自动搜索最快镜像插件:yum install yum-fastestmirror安装yum图形窗口插件:yum install yumex 1 安装yum insta ...
- 简单便捷的纯PHP网盘程序 Veno File Manager 2.6.3(VFM2)
体验过很多国外网盘程序,例如:Owncloud.Bedrive.YetiShare.XFilesharing.uCloud.Cloudshare 等等,诸如此类,VFM2与这些臃肿的商用或非商用来的程 ...
- mongodb模拟生产环境的分片集群
分片是指数据拆分 将其分散在不同的机器上的过程,有时候也叫分区来表示这个概念.将数据分散到不同机器上 不需要功能强大的计算机就可以储存更多的数据,处理更大的负载. 几乎所有的数据库 ...
- Oracle 中for update和for update nowait的区别
http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowait 的区 ...
- mybatis性能优化之降低数据库连接
做性能优化的最重要的功能就是降低数据库的交互.非常多程序猿一般在开发的时候仅仅考虑简单的实现功能,无论业务简单复杂,仅仅要实现即可. mybatis有个重要的功能就是考虑在联合查询时技巧: <? ...
- hdu5386(暴力)
题意: 给出两个n*n的矩阵,一个作为初始矩阵.一个作为目标矩阵,给出m个操作,操作有两种,一种是"L,x,y".代表我们要把x这一行赋成y,还有一种是"H,x,y&qu ...
- Snubber电路
http://www.elecfans.com/yuanqijian/dianrongqi/20170601520736.html https://wenku.baidu.com/view/166f1 ...
- 提高网站打开速度的7大秘籍---依据Yslow工具的优化【转】
很多站长使用虚拟主机来做网站,网页内容一旦很多,网站打开速度就会特别慢,如果说服务器.带宽.CDN这类硬指标我们没有经济实力去做,不妨通过网页代码优化的方式来提高速度,卢松松总结了一些可行性的方法. ...
- session 购物车
package session; import java.io.IOException;import java.util.ArrayList;import java.util.List; import ...