Java中的图像处理——改变图像的方向
先决条件:
- Java中的图像处理——读写
- Java中的图像处理——获取和设置像素
- Java中的图像处理——彩色图像到灰度图像的转换
- Java中的图像处理——彩色图像到负图像的转换
- Java中的图像处理——彩色到红绿蓝图像的转换
- Java中的图像处理——彩色图像到棕褐色图像的转换
- Java中的图像处理——创建随机像素图像
- Java中的图像处理——创建镜像
- Java中的图像处理——人脸检测
- Java中的图像处理——给图像加水印
改变图像的方向
在这里,我们将使用 OpenCV 通过使用OpenCV 库的 CORE.flip() 方法来更改任何输入图像的方向。主要思想是将输入的缓冲图像对象转换为垫子对象,然后将创建一个新的垫子对象,其中原始垫子对象值在方向修改后放置在其中。为了实现上述结果,我们将需要一些 OpenCV 方法:
- getRaster() – 该方法返回一个可写栅格,该栅格又用于从输入图像中获取原始数据。
- put(int row, int column, byte[] data) 或 get(int row, int column, byte[] data):用于将原始数据读/写到 mat 对象中。
- flip(mat mat1, mat mat2, int flip_value):mat1 和 mat2 对应输入和输出 mat 对象,flip_value 决定方向类型。flip_value 可以是 0(沿 x 轴翻转)、1(沿 y 轴翻转) -axis),-1(沿两个轴翻转)。
实现:让示例图像如下:
例子:
Java
// Java program to Illustrate How to Change
// Orientation of an Image
// Importing required classes
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
// Main class
// OrientingImage
public class GFG {
// Main driver method
public static void main(String[] args)
throws IOException
{
// Loading methods of the opencv library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// Passing the input image as path from local
// directory by creating object of File class
File input = new File("E:\\test.jpg");
// Reading image
BufferedImage image = ImageIO.read(input);
// Converting buffered image object to mat object
byte[] data = ((DataBufferByte)image.getRaster()
.getDataBuffer())
.getData();
Mat mat = new Mat(image.getHeight(),
image.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, data);
// Creating a new mat object and
// putting the modified input mat object
// using flip() method
Mat newMat
= new Mat(image.getHeight(), image.getWidth(),
CvType.CV_8UC3);
// Fipping the image about both axis
Core.flip(mat, newMat, -1);
// Converting the newly created mat object to
// buffered image object
byte[] newData
= new byte[newMat.rows() * newMat.cols()
* (int)(newMat.elemSize())];
newMat.get(0, 0, newData);
BufferedImage image1 = new BufferedImage(
newMat.cols(), newMat.rows(), 5);
image1.getRaster().setDataElements(
0, 0, newMat.cols(), newMat.rows(), newData);
// Storing the output image by
// creating object of File class
File output = new File("E:\\result.jpg");
ImageIO.write(image1, "jpg", output);
}
}
输出:
Note: Do not scale for resolution as the output image is appended bigger to perceive better, it will be generated on IDE of same size as that of resolution and size passed of the input image.