Bài viết này mình sẽ cùng bạn tìm hiểu một chút về Xử lý ảnh trong Java. Hi vọng nó giúp ích cho bạn nếu bạn đang tìm hiểu về phần này.
Xử lý ảnh là một phân ngành khoa học rất phát triển trong những năm gần đây. Xử lý ảnh gồm 4 lĩnh vực chính:
-
Nâng cao chất lượng ảnh
-
Nhận dạng ảnh
-
Nén ảnh
-
Và Truy vấn ảnh.
Sự phát triển của xử lý ảnh đã đem lại rất nhiều lợi ích cho cuộc sống của con người.
Ngày nay xử lý ảnh được áp dụng rất rộng rãi trong đời sống như: Photoshop, các phần mềm nhận dạng biển số xe, nhận diện khuôn mặt, nhận dạng chữ viết, xử lý ảnh thiên văn, ảnh y tế,....
Các thuật toán về xử lý ảnh thường rất phức tạp, kể cả việc tưởng chừng đơn giản như nén ảnh để giảm dung lượng lưu trữ mà vẫn giữ được chất lượng ảnh tốt cũng là vấn đề hóc búa.
Có rất nhiều bạn đang không rõ về lĩnh vực này nên trong bài viết mình sẽ giới thiệu sơ lược về xử lý ảnh với Java (có sử dụng thư viện OpenCV).
Hướng dẫn xử lý ảnh trong Java với thư viện OpenCV
Hy vọng qua bài này phần nào giúp các bạn có cái nhìn tổng quan về lĩnh vực Xử lý ảnh và có thêm hiểu biết về ngôn ngữ Java.
> Tham khảo: Khóa học Java Full stack nếu bạn là người mới bắt đầu.
Hướng dẫn xử lý ảnh trong Java qua ví dụ đơn giản
Việc xử lý một bức ảnh bất kỳ mà nói thì có vô vàn phương thức và cách xử lý.
Nó là tổ hợp kiến thức của cả một phân ngành, cả một môn học thậm chí là một lĩnh vực dành cho những ai đi chuyên sâu.
Trong các IDE, Java cũng đã cung cấp nhiều phương thức để hỗ trợ cho việc xử lý ảnh được thuận tiện hơn và bớt lệ thuộc vào thư viện bên ngoài.
Nhưng ở mức độ cơ bản, chúng ta có thể xem qua một số ví dụ để thấy được cái hay của lĩnh vực này.
Ví dụ #1: Chuyển một bức ảnh có gam màu chuẩn sang một màu khác.
Để thực hiện việc chuyển màu này, bạn cần chuẩn bị một hình ảnh để code mình viết ra có cái mà chuyển, ở đây mình hình của mình lưu ở F:\\content-niit\\image-to-process.jpg
.
Bạn thử chạy chương trình bên dưới và kiểm tra lại xem kết quả sau khi xử lý ảnh nó như thế nào?
Phần giải thích code mình đã chú thích theo dạng code comment rồi nhé.
package image;
import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class GrayConvert {
public static void main(String args[]) throws IOException {
BufferedImage img = null;
File f = null;
// đọc hình ảnh từ máy tính
try {
f = new File("F:\\content-niit\\image-to-process.jpg");
img = ImageIO.read(f);
} catch (IOException e) {
System.out.println(e);
}
// lấy chiều cao và chiều rộng của ảnh
int width = img.getWidth();
int height = img.getHeight();
// chuyển đổi sang màu xám
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// x,y là toạ độ của ảnh để sửa các giá trị pixel
int p = img.getRGB(x, y);
int a = (p >> 24) & 0xff;
int r = (p >> 16) & 0xff;
int g = (p >> 8) & 0xff;
int b = p & 0xff;
// tính giá trị trung bình
int avg = (r + g + b) / 3;
// thay RGB bằng giá trị avg vừa tính được
p = (a << 24) | (avg << 16) | (avg << 8) | avg;
img.setRGB(x, y, p);
}
}
// lưu ảnh
try {
f = new File("F:\\content-niit\\image-processed.jpg");
ImageIO.write(img, "jpg", f);
} catch (IOException e) {
System.out.println(e);
}
}
}
Ví dụ #2. Tăng độ tương phản cho ảnh.
Chúng ta cùng thử với cùng một nguồn ảnh (F:\\content-niit\\image-to-process.jpg) như ví dụ trên nhé.
Từ ví dụ này trở đi, bạn nên tìm hiểu cách import cũng như sử dụng thư viện OpenCV trong các dự án của mình.
package image;
// import thư viện opencv
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class EnhancingContrast {
static int width;
static int height;
static double alpha = 2;
static double beta = 50;
public static void main(String[] args) {
try {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat source = Highgui.imread("F:\\content-niit\\image-to-process.jpg ",
Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.equalizeHist(source, destination);
Highgui.imwrite("F:\\content-niit\\image-enhanced.jpg ", destination);
} catch (Exception e) {
System.out.println("error: " + e.getMessage());
}
}
}
Ví dụ #3. Nhận diện khuôn mặt với thư viện OpenCV trong Java.
Chắc các bạn đã từng nghe nhiều đến công nghệ nhận diện khuôn mặt, nhưng không phải ai cũng biết nó được viết ra như thế nào.
Vậy hôm nay, chúng ta cùng tìm hiểu xem, Java nhận diện khuôn mặt như thế nào nhé.
package image;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class FaceDetection {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
CascadeClassifier faceDetector = new CascadeClassifier();
faceDetector.load("haarcascade_frontalface_alt.xml");
Mat image = Imgcodecs.imread("F:\\content-niit\\image-to-process.jpg");
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
for (Rect rect : faceDetections.toArray()) {
Imgproc.rectangle(image, new Point(rect.x, rect.y),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
}
String filename = "F:\\content-niit\\image-detected.jpg";
Imgcodecs.imwrite("F:\\" + filename, image);
}
}
Nhận diện khuôn mặt tưởng khó hoá ra code cũng không dài ngoằn nghoèo như bạn nghĩ đúng không.
Bởi lẽ phần lớn công việc đã được hỗ trợ bởi thư viện OpenCV rồi, đây là công cụ hỡ trợ cực kỳ mạnh mẽ không thể thiếu đối với các nhà lập trình chuyên về xử lý ảnh.
Kết luận
Chúng ta đã điểm qua vài ví dụ về các tính năng xử lý ảnh trong Java. Nó là một lĩnh vực thú vị và rất đáng chú ý trong thời điểm hiện tại.
Việc tìm hiểu và thông thạo về lĩnh vực này là cơ hội rộng mở đối với lập trình viên Java nói chung và những ai muốn đi theo chuyên ngành này nói riêng.
Xử lý ảnh đã dần khẳng định và đóng góp vai trò quan trọng trong hầu hết các lĩnh vực đời sống, nếu bạn thấy thú vị hoặc muốn khám phá sâu về chuyên ngành này hãy bắt đầu ngay để đón kịp xu thế.
Trong phạm vi bài viết, mình có nói và sử dụng qua OpenCV – đây là công cụ và cũng là trợ thủ đắc lực giúp bạn thực hiện các công việc xử lý ảnh một cách đơn giản hơn.
Hẹn các bạn ở bài khác, chúng ta sẽ nói nhiều về thư viện OpenCV này nhé.
Tham khảo: https://www.tutorialspoint.com/java_dip/index.htm
---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Dạy học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543 - 0353655150
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python