Java DIP - Chuyển đổi hình dạng hình ảnh
Hình dạng của hình ảnh có thể dễ dàng thay đổi bằng cách sử dụng OpenCV. Hình ảnh có thể được lật, chia tỷ lệ hoặc xoay theo bất kỳ hướng nào trong bốn hướng.
Để thay đổi hình dạng của ảnh, ta đọc ảnh và chuyển thành đối tượng Mat. Cú pháp của nó được đưa ra dưới đây:
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
Lật hình ảnh
OpenCV cho phép ba loại mã lật được mô tả bên dưới:
Sr.No. | Mã lật & mô tả |
---|---|
1 | 0 0 có nghĩa là, quay quanh trục x. |
2 | 1 1 có nghĩa là, quay quanh trục y. |
3 | -1 -1 nghĩa là quay quanh cả hai trục. |
Chúng tôi chuyển mã lật thích hợp vào phương thức flip() bên trong Corelớp học. Cú pháp của nó được đưa ra dưới đây:
Core.flip(source mat, destination mat1, flip_code);
Phương pháp flip() lấy ba tham số - ma trận ảnh nguồn, ma trận ảnh đích và mã lật.
Ngoài phương thức lật, còn có các phương thức khác được cung cấp bởi lớp Core. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | add(Mat src1, Mat src2, Mat dst) Nó tính tổng mỗi phần tử của hai mảng hoặc một mảng và một đại lượng vô hướng. |
2 | bitwise_and(Mat src1, Mat src2, Mat dst) Nó tính toán sự kết hợp khôn ngoan trên từng phần tử của hai mảng hoặc một mảng và một đại lượng vô hướng. |
3 | bitwise_not(Mat src, Mat dst) Nó đảo ngược từng bit của một mảng. |
4 | circle(Mat img, Point center, int radius, Scalar color) Nó vẽ một vòng tròn. |
5 | sumElems(Mat src) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | subtract(Mat src1, Scalar src2, Mat dst, Mat mask) Nó tính toán sự khác biệt trên mỗi phần tử giữa hai mảng hoặc mảng và một đại lượng vô hướng. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Core để lật một hình ảnh:
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
public class Main {
public static void main( String[] args ) {
try {
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
byte[] data = ((DataBufferByte) image.getRaster(). getDataBuffer()).getData();
Mat mat = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);
mat.put(0, 0, data);
Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);
Core.flip(mat, mat1, -1);
byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())];
mat1.get(0, 0, data1);
BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5);
image1.getRaster().setDataElements(0,0,mat1.cols(),mat1.rows(),data1);
File ouptut = new File("hsv.jpg");
ImageIO.write(image1, "jpg", ouptut);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
Đầu ra
Khi bạn chạy ví dụ trên, nó sẽ lật tên hình ảnh digital_image_processing.jpg vào hình ảnh không gian màu HSV tương đương của nó và ghi nó vào đĩa cứng với tên flip.jpg.