当前位置:首页 > 软件工程毕业设计(论文)-J2EE网络相册管理系统 - 图文
杭州电子科技大学本科毕业设计
API函数:public static AffineTransform getTranslateInstance(double tx, double ty) 2、缩放变换。缩放变换是将每一点的横坐标放大(缩小)至sx倍,纵坐标放大(缩小)至sy倍,故变换矩阵为:
[ sx 0 0 ] [ 0 sy 0 ] [ 0 0 1 ]
API函数:public static AffineTransform getScaleInstance (double sx, double sy) 3、旋转变换。旋转变换是将目标图形围绕锚点(x,y)顺时针旋转theta弧度,故变换矩阵为:
[ cos(theta) -sin(theta) x-x*cos+y*sin ] [ sin(theta) cos(theta) y-x*sin-y*cos ] [ 0 0 1 ] API函数:public static AffineTransform
getRotateInstance(double theta, double x, double y)
而通过这些基本变换的组合(即矩阵相乘),又可以衍生出更为复杂的变换。 当然在已知变换矩阵的情况下也可以直接创建AffineTransform的实例: public AffineTransform(double[] flatmatrix)
其中flatmatrix为{ m00,m10,m01,m11,m02,m12}。或者直接如下: public AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
最后可通过AffineTransformOp类就可以来实现AffineTransform实例所描述的从源2D坐标到目标2D坐标变换。
图像卷积是一种重要的图像处理方法,其基本原理是:像元的灰度值等于以此像元为中心的若干个像元的灰度值分别乘以特定的系数后相加的平均值。由这些系数排列成的矩阵叫卷积核。选用不同的卷积核进行图像卷积,可以取得各种处理效果。例如,除去图像上的噪声斑点使图像显得更为平滑;增强图像上景物的边缘以使图像锐化;提取图像上景物的边缘或特定方向的边缘等。常用的卷积核为3×3或5×5的系数矩阵,有时也使用7×7或更大的卷积核以得到更好的处理效果,但计算时间与卷积核行列数的乘积成正比地增加
Java中使用ConvolveOp类实现从源到目标的卷积,在构造ConvolveOp时需要传入一个Kernel,即卷积核对象。具体API为:public ConvolveOp(Kernel kernel)。
一般计算机对色彩的解析都是基于RGB或者ARGB色彩模式,而从视觉的角度定义的颜色模式则更适合用户的理解,而HSB正是基于人类对色彩的感觉来定义色彩的。
HSB模型描述颜色的三个特征:
32
杭州电子科技大学本科毕业设计
1、色相H(Hue):在0~360°的标准色轮上,色相是按位置度量的。在通常的使用中,色相是由颜色名称标识的,比如红、绿或橙色。
2、饱和度S(saturation):是指颜色的强度或纯度。饱和度表示色相中彩色成分所占的比例,用从0(灰色)~100%(完全饱和)的百分比来度量。在标准色轮上饱和度是从中心逐渐向边缘递增的。
3、亮度B(brightness):是颜色的相对明暗程度,通常是从0(黑)~100%(白)的百分比来度量的。
而在Java中提供了简单的API来处理这个色彩模式的变换: public static int HSBtoRGB(float hue, float saturation, float brightness) public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) 4.3.2 图像处理的具体实现
有了上面的理论基础我们既可以方便的实现一些简单的图像变换:
1、图像的旋转。图像旋转分为改变大小和保持大小。改变大小的旋转可以先通过公式算出边界点,把图像平移边界数值,以保证图片旋转后位于至正坐标内。具体如下:
float cosTheta = (float) Math.cos(theta); float sinTheta = (float) Math.sin(theta); // 除(0,0)以外的三个顶点坐标
float ptX[] = new float[3]; float ptY[] = new float[3]; // 任意一点坐标 float x; float y; // 旋转后的边界点
float minX = 0; float minY = 0; float maxX = 0; float maxY = 0; ptX[0] = srcWidth - 1; ptY[0] = 0; ptX[1] = 0; ptY[1] = srcHeight - 1;
ptX[2] = srcWidth - 1; ptY[2] = srcHeight - 1; // 计算旋转后的边界 for (int i = 0; i < 3; i++) {
x = ptX[i] * cosTheta - ptY[i] * sinTheta; }
33
if (x < minX) { minX = x; } if (x > maxX) { maxX = x; }
y = ptX[i] * sinTheta + ptY[i] * cosTheta; if (y < minY) { minY = y; } if (y > maxY) { maxY = y; }
杭州电子科技大学本科毕业设计
// 计算旋转后的图片大小
int destWidth = Math.round(maxX - minX + 1); int destHeight = Math.round(maxY - minY + 1); // 根据平移矩阵平移(其中tx=-minX,ty=-minY)
AffineTransform at = AffineTransform.getTranslateInstance(-minX, -minY); // 根据矩阵旋转(其中旋转角度theta=theta) at.rotate(theta);
AffineTransformOp ato = new AffineTransformOp(at,
AffineTransformOp.TYPE_BILINEAR);
BufferedImage tempImage = new BufferedImage(destWidth,
destHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage destImage = new BufferedImage(destWidth,
destHeight, BufferedImage.TYPE_INT_RGB);
// 得到旋转后的图片alpha为0处,为黑色(0x00000000),需要绘制一次背景 ato.filter(srcImage, tempImage);
Graphics2D g2d = destImage.createGraphics(); g2d.setBackground(Color.WHITE); g2d.fillRect(0, 0, destWidth, destHeight); // 把ARGB得图转到RGB
g2d.drawImage(tempImage, 0, 0, destWidth, destHeight, null);
而不变图像大小的变换只需要,以中点为锚点旋转图像即可。具体实现如下: AffineTransform at = AffineTransform.getRotateInstance(theta, srcWidth / 2,
srcHeight / 2);
AffineTransformOp ato = new AffineTransformOp(at,
AffineTransformOp.TYPE_BILINEAR); srcHeight, BufferedImage.TYPE_INT_ARGB); srcHeight, BufferedImage.TYPE_INT_RGB);
BufferedImage tempImage = new BufferedImage(srcWidth, BufferedImage destImage = new BufferedImage(srcWidth,
// 得到旋转后的图片alpha为0处,为黑色(0x00000000),需要绘制一次背景 ato.filter(srcImage, tempImage);
Graphics2D g2d = destImage.createGraphics(); g2d.setBackground(Color.WHITE); g2d.fillRect(0, 0, srcWidth, srcHeight); // 把ARGB得图转到RGB
34
杭州电子科技大学本科毕业设计
g2d.drawImage(tempImage, 0, 0, srcWidth, srcHeight, null);
同理,图像的定比缩放、水平镜像、垂直镜像也可以如此实现,不同的是获取的AffineTransform实例不同罢了,而且也并不会产生多余的背景,故而也不需要重绘背景。获取实例的实现如下:
定比缩放。AffineTransform at = AffineTransform.getScaleInstance(factor, factor); 水平镜像。AffineTransform at = new AffineTransform({ -1, 0, 0, 1, 0, 0 }); 垂直镜像。AffineTransform at = new AffineTransform({ 1, 0, 0, -1, 0, 0 }); 2、锐化。通过一个3×3的卷积核进行卷积,其中卷积核矩阵如下: [ -1 -1 -1 ] [ -1 9
-1 ]
[ -1 -1 -1 ] 而具体具体实现如下:
int srcWidth = srcImage.getWidth(); int srcHeight = srcImage.getHeight();
float sharpenData[] = { -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f,
-1.0f, -1.0f, -1.0f };
ConvolveOp co = new ConvolveOp(new Kernel(3, 3, sharpenData)); BufferedImage destImage = new BufferedImage(srcWidth, srcHeight,
BufferedImage.TYPE_INT_RGB);
co.filter(srcImage, destImage); return destImage;
同理,模糊也如此,只是核心矩阵不同,模糊的卷积核矩阵为: [ 0.1 0.1 0.1 ] [ 0.1 0.1 0.1 ] [ 0.1 0.1 0.1 ]
3、色调调整。色调调整是把图像的每个像素转换至HSB色彩模式后调整色调分量,然后转换回RGB色彩模式。具体实现如下:
BufferedImage destImage = new BufferedImage(srcWidth, srcHeight,
BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < srcWidth; i++) { for (int j = 0; j < srcHeight; j++) { int color = srcImage.getRGB(i, j);
float[] hsb = RGB2HSB(color); hsb[0] += deltaHue; color = HSB2RGB(hsb);
35
共分享92篇相关文档